现阶段的主要矛盾是落后的生产力不能满足日益增长的物质文化需求

注册 | 登陆

addslashes的安全问题

PHP代码
  1. <?php  
  2. $a = "abc's";  
  3. //echo getHex(addslashes($a));  
  4.   
  5. $a = getStr('bf27'); 
  6. echo getHex(addslashes($a)); 
  7. echo ""; 
  8. echo getHex(strip27(addslashes($a))); 
  9.  
  10. function getHex($a) { 
  11.     $len = strlen($a); 
  12.     for ($i = 0; $i < $len; $i++) { 
  13.         $t .= dechex(ord($a[$i])); 
  14.     } 
  15.     return $t; 
  16. } 
  17.  
  18. function getStr($a) { 
  19.     $len = strlen($a); 
  20.     for ($i = 0; $i < $len; $i += 2) { 
  21.         $t .= chr(hexdec(substr($a, $i, 2))); 
  22.     } 
  23.     return $t; 
  24. } 
  25. //不一定正确的二次过滤 
  26. function strip27($str, $encoding = 'gbk') {  
  27.     $len = strlen($str);  
  28.     for ($i = 0; $i < $len$i++) {  
  29.         if (ord($str[$i]) > 127) {  
  30.             $i++;  
  31.         } else if ($str[$i] == chr(0x27)) {  
  32.             $str[$i] = chr(0x20);  
  33.         }  
  34.     }  
  35.     return $str;  
  36. }  


http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html
重装系统之后虚拟机起不了,直接在zs中测试,确实存在问题,
PHP处理字符还是以单字节为单位,所以PHP页面中如果不放中文,可以存成任何编码
addslashes在过滤的时候也是以字节进行过滤的,这就会破坏GBK的序列,逻辑上来说,
即使不注入,使用addslashes也会导致个别字符乱码。
如果数据库是gbk,插入数据库时,数据库0xbf5c当成一个字,这种情况不只在gbk其它多字节的数据库里也应该有问题

update:080901  晕,我一直有个误区,以为gbk的第二个字节是从0开始,BS,实际GBK的范围是在8140-FEFE,这样,0x27不在gbk的范围中,直接使用str_replace替换就OK,谢谢safe3前辈

update:081030 想BS一下自己,因为空間商关门了一直没机会,竟然一直相当然mysql_real_escape_string和addslashes是一样的。

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8

发表评论

评论内容 (必填):