• CI 防止sql注入和xss攻击


     

    CI(codeigniter)如何防止sql注入

     发表时间: 2012-11-30 06:52:12  By:雪洁  浏览次数:6009

    一般情况下我们只要使用AR和开启xss就可以防止了。实现方法:

    1.开启xss

    1 $config['global_xss_filtering']= TRUE;

    2.使用AR

    也许你会问AR是什么?参考ci手册,请看下图:

    相信你应该明白了。

    那么有的朋友会说为什么我都用了还是有注入呢?那么你就要分析其他方面的漏洞了。

    因 为如果你全部使用了AR,那么你传进去的都是些“表名,条件”之类的参数,如果是sql注入的话这些参数传进去会是失效的,比 如:$this->db->get('table');如果把table换成"select * from admin"它会执行成功吗?以上只是个人想法,不正确的还请指正。

    以下一些建议可供参考。

    1.无论如何在获取参数之时都建设将 xss过滤打开,比如

    1. $this->input->get('username',true);

    其中的true就代表打开了 xss

    2.不要直接使用$_GET等类似方式获得数据,如果这样获取数据的话将不会被xss过滤

    3.CI的数据在入库之前不仅不会增加转义字符,而且还会取消它
    比如 Input.php 里面的这么一段

    1. // We strip slashes if magic quotes is on to keep things consistent  
    2. if(get_magic_quotes_gpc())  
    3. {  
    4. $str = stripslashes($str);  
    5. }


    4.如果你使用 $this->db->query('YOUR QUERY HERE'); 直接查询数据库,那么你需要使用 $this->db->escape('fileld_name') 语句进行转义,这样才安全。
    escape函数实际上是调用的escape_str这个函数,只不过escape增加了一层对数据类型的判断,看到了没(注意:它可没判断数值类型的哟,所以说如果传入的数据是数值型的话,你得自己动手判断一下了),下面这两个东东就是进行转义的家伙了。

    1. function escape($str)  
    2. {  
    3. if(is_string($str))  
    4. {  
    5. $str ="'".$this->escape_str($str)."'";  
    6. }  
    7. elseif (is_bool($str))  
    8. {  
    9. $str =($str === FALSE)?0:1;  
    10. }  
    11. elseif (is_null($str))  
    12. {  
    13. $str ='NULL';  
    14. }  
    15.  
    16. return $str;  
    17. }  
    18.  
    19. function escape_str($str, $like = FALSE)    
    20. {    
    21. if(is_array($str))  
    22. {  
    23. foreach($str as $key => $val)  
    24. {  
    25. $str[$key]= $this->escape_str($val, $like);  
    26. }  
    27.  
    28. return $str;  
    29. }  
    30.  
    31. if(function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))  
    32. {  
    33. $str = mysql_real_escape_string($str, $this->conn_id);  
    34. }  
    35. elseif (function_exists('mysql_escape_string'))  
    36. {  
    37. $str = mysql_escape_string($str);  
    38. }  
    39. else  
    40. {  
    41. $str = addslashes($str);  
    42. }  
    43.  
    44. // escape LIKE condition wildcards  
    45. if($like === TRUE)  
    46. {  
    47. $str = str_replace(array('%','_'), array('\%','\_'), $str);  
    48. }  
    49.  
    50. return $str;  
    51. }


    5.无论如何你都必须要对数值型数据手动判断,这个得你自己做,比如用个 (int)之类的强制转换。

    1. 对于使用 Active Record 操作的数据你可以偷懒不用 $this->db->escape('fileld_name') 转义了(事实上你如果你使用了反而会被多增加些引号之类的东西),因为它会帮你搞定,但数值型你还是要自己判断。

    2. 如果你使用 Active Record 操作的数据,那么其实CI是在数据快要入数据库的时候进行转义的,所以在前面的很多地方你都看不到addslashes之类函数的身影,这样做也是有好处的你看看escape_str函数里对转义函数的判断就知道了。

    8.上面我一再强调数值型数据必须得自己搞定,实际上如果你的SQL语句中对数值型加了单引号的话,应该问题不大,不过还是建议处理一下。

     

  • 相关阅读:
    【Foreign】无聊的计算姬 [Lucas][BSGS]
    【Foreign】远行 [LCT]
    Leetcode题解(十)
    Leetcode题解(九)
    Leetcode题解(八)
    Leetcode题解(七)
    Leetcode题解(六)
    Leetcode题解(五)
    Leetcode题解(四)
    Leetcode题解(三)
  • 原文地址:https://www.cnblogs.com/afei-happy/p/3411976.html
Copyright © 2020-2023  润新知