在使用未预编译的sql时,如果不进行转义,则容易出现sql注入
例如:
$sql = "select * from user where username='$username' and password='$password'";
此时,如果账户名是一个字符串:zhangsan’#
select * from user where username='zhangsan'#' and password='$password
由于在mysql中,#表示注释,则真实sql:
select * from user where username='zhangsan'
此时就跳过密码,登录到系统中了。如果zhangsan是管理员,若后台有数据库连接,执行、导出等功能,最终整个数据库都直接被盗取。
一个严重的问题,就是sql参数赋值时,可以使用 ‘ ,从而抵消了前面 的 ‘ ,于是传递的值可以造成sql侵入。
可以使用 get_magic_quotes_gpc() 检测一个字符串是否已经转义,如果未转义,则使用 addslashes() 函数进行转义。
php中的GET、POST、COOKIE自动转义:
PHP中,有一个魔术引号的概念,如何打开?答:在PHP.ini中,magic_quotes_gpc=On;重启apache即可
魔术引号被打开后,系统会自动对$_GET,$_POST,$_COOKIE数据进行转义,在不知情的情况下,再次进行手动转义的话,就转多了,要想合理的进行转义,就要首先判断,魔术符号是否已经打开了,用magic_quotes_gpc()进行判断,不需要传值,关闭返回0,关闭返回1