来源
表单输入或者url传参
常见攻击方式
- 使用
';
和--
SELECT * FROM xq_adv where title='zhangsan';DROP TABLE xq_article--'
引号和分号是为了隔离前面的sql语句,后面的--代表注释。因为最后一个'
可能会影响删表,所以使用注释不影响执行删表。注意:最后一个引号来自代码封装:原语句可能如下的写法:
$sql = "SELECT * FROM xq_adv where title='".$_GET['title']."'";
#这句php代码因为title本身是被引号的
- 使用
';'
+or
+--
SELECT * FROM xq_adv where title='zhangsan' or DROP TABLE xq_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不考虑连接的当前字符集。