php内置过滤函数讲义

  

php有内置的函数用来防御* * *,简单的介绍几个函数。


魔术引号

当打开时,所有的& # 39;(单引号),“(双引号),\(反斜线)和零字符都会被自动加上一个反斜线进行转义。这和addslashes()作用完全相同。

 php内置过滤函数讲义

一共有三个魔术引号指令:

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内置过滤函数讲义