OWASP (Open Web Application Security Project) 是一个记录当前 web 应用所受威胁情况的项目。我一直都在关注他们的网站,从 2010,2013 和 2017 年的报告中我发现了一些相似之处,SQL 或其他类型的注入威胁都是高居榜首。
这是个心腹大患。
它会导致你破产,因此这个事情关乎存亡,你单位应该着力处理此类问题避免它的出现。
什么是注入?
所谓注入,就是数据没有经过过滤,将无法信任的内容直接写入了系统解释器,这种行为会导致对站点产生SQL注入,更糟糕的是,攻击者可能会获得对系统的全部权限。
举个例子:
看下面的恶意查询语句,它会将含有恶意行为的SQL语句放在$name变量里,然后允许用户通过POST的方式传递给PHP脚本,从而达到最终使用传入的恶意代码进行攻击的目的。
//将恶意代码, DROP TABLE写入$name变量
`$name = "Mark';DROP TABLE users; -- ";\
$query = "SELECT * FROM users WHERE name='$name'";`
经过PHP脚本解析,这会最终生成这样的SQL语句:
SELECT * FROM users WHERE name='Mark';DROP TABLE users; -- '
正如你猜的那样,上述语句会将整个users数据表从数据库里删除掉。
正如尤达说的:
这太危险了,是的,太危险了。
如何防止对 PHP 应用的恶意注入?
首先,其实并没有真的往数据库里注入什么东西,这种错误只是由于没有正确地将查询语句格式化。解决的方法很简单,只要正确地格式化 SQL 语句,或者是直接把查询语句和数据分开处理。
怎么做呢?用参数化查询对数据格式化,并使查询语句与数据分离。
使用参数化查询,可以确保程序远离注入风险。
例子如下:
`$statement = $db->prepare('SELECT * FROM table WHERE id = ? and name = ? ');\
$statement->execut