来源

表单输入或者url传参

常见攻击方式

  • 使用';--
SELECT * FROM  adv where title='zhangsan';DROP TABLE article--'

引号和分号是为了隔离前面的sql语句,后面的--代表注释。因为最后一个'可能会影响删表,所以使用注释不影响执行删表。注意:最后一个引号来自代码封装:原语句可能如下的写法:


$sql = "SELECT * FROM  adv where title='".$_GET['title']."'";
#这句php代码因为title本身是被引号的
  • 使用 ';' +or + --
SELECT * FROM  adv where title='zhangsan' or DROP TABLE article--'

注意:在PHP中的 mysql_query() 是不允许执行多个SQL语句的,但是还是可以通过or and 等语句来执行。

预防sql注入

  • 开启php魔术模式,magic_quotes_gpc=on;
  • 打开php.ini中的安全模式 safe_mode = on
  • 关闭危险函数,比如system,chmod等函数;
  • 错误信息控制 ,让非开发人员看到有关数据库错误信息是很危险的,这会泄露数据库,表,字段等名称信息以及其他不安全因素。
  • 使用php自带函数将一些特殊字符转义后再执行sql语句:
    • addslashes() 是强行加\;
    • mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
    • mysql_escape_string不考虑连接的当前字符集。