php有内置的函数用来防御* * *,简单的介绍几个函数。
魔术引号
当打开时,所有的& # 39;(单引号),“(双引号),\(反斜线)和零字符都会被自动加上一个反斜线进行转义。这和addslashes()作用完全相同。
一共有三个魔术引号指令:
magic_quotes_gpc影响到HTTP请求数据(GET、POST和饼干)。不能在运行时改变。在php中默认值为。参见get_magic_quotes_gpc ()。
magic_quotes_runtime如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在php中的默认值为。参见set_magic_quotes_runtime()和get_magic_quotes_runtime ()。
magic_quotes_sybase如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成& # 39;& # 39;。而双引号,反斜线和零字符将不会进行转义。如何取得其值参见ini_get ()。
mysql_real_escape_string
转义sql语句中使用的字符串中的特殊字符:\ x00 \ n \ r & # 39;,,, \ \ x1a
addslashes ()
返回在预定义字符之前添加反斜杠的字符串,预定义字符:& # 39;,“\,空
看了很多php网站在防sql注入上还在使用ddslashes和,大小写不敏感百度一下“php防注入“也同样在使用他们,实践发现就连mysql_real_escape_string也有* * *可以绕过的办法,如果你的系统仍在用上面三个方法,建议更好。
用以大小写不敏感及各种php字符替换函数来防注入已经不用我说了,这种“黑名单”式的防御已经被证明是经不起时间考验的。
下面给出绕过addslasher和mysql_real_escape_string的方法(技巧)。
如果你不确定你的系统是否有sql注入的风险,请将下面的下面的演示部署到你的云服务器,如果运行结果相同,那么请参考最后的完美的解决方案。
mysql:
mysql>, select 版本(); + - - - - - - - - - - - - - - - - - - - - - - - - + |,版本(),,,,,,,,,,| + - - - - - - - - - - - - - - - - - - - - - - - - + | |,5.0.45-community-ny  + - - - - - - - - - - - - - - - - - - - - - - - - + 1,row set 拷贝;(0.00,sec) mysql>, create database  test default charset GBK; Query 好吧,,1,row affected (0.00,秒) mysql>, use 测试; Database 改变了 mysql>, CREATE TABLE  users ( ,,,username VARCHAR (32), CHARACTER SET GBK, ,,,password VARCHAR (32), CHARACTER SET GBK, ,,,PRIMARY KEY (用户名) ); Query 好吧,,0,rows affected (0.02,秒) mysql>, insert into  users SET 用户名=& # 39;ewrfg& # 39;,,密码=& # 39;wer44& # 39;; Query 好吧,,1,row affected (0.01,秒) mysql>, insert into  users SET 用户名=& # 39;ewrfg2& # 39;,,密码=& # 39;wer443& # 39;; Query 好吧,,1,row affected (0.01,秒) mysql>, insert into  users SET 用户名=& # 39;ewrfg4& # 39;,,密码=& # 39;wer4434& # 39;; Query 好吧,,1,row affected (0.01,秒)=
php:
& lt; php ? echo “PHP 版本:,“.PHP_VERSION干净\ n"; mysql_connect (& # 39; servername # 39; & # 39;用户名# 39;,& # 39;密码# 39;); mysql_select_db (“test"); mysql_query (“SET  NAMES GBK"); $ _POST[& # 39;用户名# 39;],=,空空的(0 xbf) .chr (0 x27) # 39;公司,或是username =, username /* & # 39;; $ _POST[& # 39;密码# 39;],=,& # 39;猜# 39;; $ username =, addslashes ($ _POST[& # 39;用户名# 39;]); $ password =, addslashes ($ _POST[& # 39;密码# 39;]); sql 美元;=,“SELECT  *,得到,users WHERE , username =, & # 39;用户名# 39;美元,以及password =, & # 39; $密码# 39;“; $ result =, mysql_query (sql)美元,趁机trigger_error (mysql_error ()。$ sql); var_dump (mysql_num_rows(结果)美元); var_dump (mysql_client_encoding ()); $ username =, mysql_real_escape_string ($ _POST[& # 39;用户名# 39;]); $ password =, mysql_real_escape_string ($ _POST[& # 39;密码# 39;]); sql 美元;=,“SELECT  *,得到,users WHERE , username =, & # 39;用户名# 39;美元,以及password =, & # 39; $密码# 39;“; $ result =, mysql_query (sql)美元,趁机trigger_error (mysql_error ()。$ sql); var_dump (mysql_num_rows(结果)美元); var_dump (mysql_client_encoding ()); mysql_set_charset (“GBK"); $ username =, mysql_real_escape_string ($ _POST[& # 39;用户名# 39;]); $ password =, mysql_real_escape_string ($ _POST[& # 39;密码# 39;]); sql 美元;=,“SELECT  *,得到,users WHERE , username =, & # 39;用户名# 39;美元,以及password =, & # 39; $密码# 39;“; $ result =, mysql_query (sql)美元,趁机trigger_error (mysql_error ()。$ sql); var_dump (mysql_num_rows(结果)美元); var_dump (mysql_client_encoding ());php内置过滤函数讲义