• CodeIgniter 的数据安全过滤全解析


    http://justcoding.iteye.com/blog/546880

    CodeIgniter 的数据安全过滤全解析博客分类:

    由于对CI的SQL安全这些不放心,今天寡人啃了一下午的代码,算是对其机制比较了解了,为了让各位兄弟姐妹少走弯路,特将战果公布,希望大家喜欢。 1.无论如何在获取参数之时都建设将 xss过滤打开,比如 $this->input->get('username',true); 其中的true就代表打开了 xss 2.不要直接使用$_GET等类似方式获得数据,如果这样获取数据的话将不会被xss过滤 3.CI的数据在入库之前不仅不会增加转义字符,而且还会取消它 比如 Input.php 里面的这么一段

    Php代码 复制代码 收藏代码
    1. // We strip slashes if magic quotes is on to keep things consistent 
    2. if (get_magic_quotes_gpc()) 
    3. $str = stripslashes($str); 
    // We strip slashes if magic quotes is on to keep things consistent
    if (get_magic_quotes_gpc())
    {
    $str = stripslashes($str);
    }
    

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

    Php代码 复制代码 收藏代码
    1. function escape($str
    2. if (is_string($str)) 
    3. $str = "'".$this->escape_str($str)."'"
    4. elseif (is_bool($str)) 
    5. $str = ($str === FALSE) ? 0 : 1; 
    6. elseif (is_null($str)) 
    7. $str = 'NULL'
    8.  
    9. return$str
    10.  
    11. function escape_str($str, $like = FALSE)    
    12. {    
    13. if (is_array($str)) 
    14. foreach($stras$key => $val
    15. $str[$key] = $this->escape_str($val, $like); 
    16.  
    17. return$str
    18.  
    19. if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) 
    20. $str = mysql_real_escape_string($str, $this->conn_id); 
    21. elseif (function_exists('mysql_escape_string')) 
    22. $str = mysql_escape_string($str); 
    23. else 
    24. $str = addslashes($str); 
    25.  
    26. // escape LIKE condition wildcards 
    27. if ($like === TRUE) 
    28. $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); 
    29.  
    30. return$str
    function escape($str)
    {
    if (is_string($str))
    {
    $str = "'".$this->escape_str($str)."'";
    }
    elseif (is_bool($str))
    {
    $str = ($str === FALSE) ? 0 : 1;
    }
    elseif (is_null($str))
    {
    $str = 'NULL';
    }
    
    return $str;
    }
    
    function escape_str($str, $like = FALSE)   
    {   
    if (is_array($str))
    {
    foreach($str as $key => $val)
    {
    $str[$key] = $this->escape_str($val, $like);
    }
    
    return $str;
    }
    
    if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
    {
    $str = mysql_real_escape_string($str, $this->conn_id);
    }
    elseif (function_exists('mysql_escape_string'))
    {
    $str = mysql_escape_string($str);
    }
    else
    {
    $str = addslashes($str);
    }
    
    // escape LIKE condition wildcards
    if ($like === TRUE)
    {
    $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    }
    
    return $str;
    }
    

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

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

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

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

  • 相关阅读:
    图片懒加载技术
    验证码处理
    基于requests模块的cookie,session和线程池爬取
    最快理解
    Golang
    Django REST framework
    Django REST framework
    Django
    Django
    搭建邮件服务器 Postfix + Dovecot (CentOS)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2993990.html
Copyright © 2020-2023  润新知