代码之家  ›  专栏  ›  技术社区  ›  Steven

mysql-real-escape-string是否足以插入非常简单的数据库?

  •  1
  • Steven  · 技术社区  · 14 年前

    样例代码:

    $email = "" . $_POST['email'];
    $con = mysql_connect("localhost","user","pass")
      or die('Could not connect to database.');
    mysql_select_db("face", $con);
    
    // Sanitization step
    $sanitemail = mysql_real_escape_string($email);
    
    // Is this safe?
    mysql_query("INSERT INTO landing_oct_2010 (email) VALUES ('$sanitemail');");
    

    我想知道,对于这个简单的任务,是否只使用 mysql_real_escape_string 完全足以防止至少注入式SQL攻击,或者如果有其他预防措施,我应该采取。

    我在这个示例中收集电子邮件地址的事实是偶然的。如果我知道我在处理电子邮件地址,我只需要加入一个regex和一些DNS检查,在那里我也会内置验证。但是,我想把重点放在手头的一般问题上:单一的卫生功能是否足够?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Michael Madsen    14 年前

    是的,足够了。嗯,有点像。

    如果使用得当且始终如一, mysql_real_escape_string 应该足以防止SQL注入。这个功能(不像 mysql_escape_string )考虑到连接的字符集,因此只要您使用正确的字符集进行通信,它就应该适用于任何站点。

    然而,在过去, bugs have existed 在转义例程中,这可能导致无论如何都可以进行SQL注入(给定正确的条件)。

    更好的选择是将参数化查询与mysqli库一起使用,因为这样就完全不需要进行转义。参数化查询基本上是通过将数据与查询结构分离来工作的,而这又意味着 不可能的 执行SQL注入。在实现方面,数据库开发人员也很难引入允许SQL注入的bug,同样,因为查询结构是单独给出的。

        2
  •  0
  •   Ruel    14 年前

    是的,够了。相比于 addslashes() , mysql_real_escape_string() 知道哪些字符会影响MySQL命令。此外,您可以不使用 stripslashes() .

        3
  •  0
  •   Drewdin    14 年前

    我也会用“修剪”来删除空格

    $sanitemail = mysql_real_escape_string(trim($email));
    
        4
  •  0
  •   Your Common Sense    14 年前

    是的,一般来说。

    但必须记住一些重要的条件:

    1. mysql_real_escape_string()不是“清理”函数。它不会“清理”数据使其“安全”,而只是转义定界符。因此,定界符是非常重要的部分。此函数仅在处理的数据包含在引号中时工作。否则毫无帮助。
    2. 要让Charset魔法发挥作用, mysql_set_charset() 应首先调用函数。否则,在使用除UTF-8之外的多字节编码的情况下,这个函数不会有帮助。
        5
  •  -3
  •   T_t    14 年前

    据我所知,有一些有用的东西:

        class mysql_db{
            var $connid;
    
            var $search = array('/union/i', '/load_file(\s*(\/\*.*\*\/)?\s*)+\(/i','/into(\s*(\/\*.*\*\/)?\s*)+outfile/i');
            var $replace = array('union  ', 'load_file   (', 'into   outfile');
    
            function escape($string){
              if(!is_array($string)) return str_replace(array('\n', '\r'), array(chr(10), chr(13)),mysql_real_escape_string(preg_replace($this->search, $this->replace, $string), $this->connid));
              foreach($string as $key=>$val) $string[$key] = $this->escape($val);
              return $string;
            }
    }