逃脱字符串的最佳使用和实践

可能重复:
防止PHP中的SQL注入的最佳方法

查询时转义字符串的最佳方式是什么? mysql_real_escape_string()似乎很好,但我不完全知道如何正确使用它。

这段代码是否正确地完成这项工作?

<?php
   /* Let's say that the user types "'#""#''"{(})#&/€ in a textfield */
   $newStr = mysql_real_escape_string($str);
   $query = "INSERT INTO table username VALUES ($str)";
   mysql_query($query);
?>

编辑:

现在我有这样的代码:

      $email = $_POST['email'];
    $displayName = $_POST['displayName'];
    $pass = $_POST['pass1'];

    $email = mysqli_real_escape_string($link, $email);
    $displayName = mysqli_real_escape_string($link, $displayName);
    $pass = mysqli_real_escape_string($link, $pass);

    $insert = "INSERT INTO profiles (email, displayName, password)
    VALUES ('$email', '$displayName', md5('$pass'))";
    mysqli_query($link, $insert)
    or die(mysqli_error($link));

但是我得到这个错误:你的SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册,以便在第1行附近使用正确的语法附近的“!”#!##^!“#!”#!“#^'''''''

如果用户输入:'**!“#!#^!”#!“*#!”#^''''


最好的方法是不要逃避字符串,而是使用参数化查询,这会在幕后为您完成。


像这样使用mysql_real_escape_string可以工作,但你需要:

  • 在值周围添加引号。
  • 使用结果$newStr ,而不是原始值$str
  • 将表名更改为不是保留关键字的名称。
  • 围绕列列表添加括号。
  • 尝试这个:

    $query = "INSERT INTO yourtable (username) VALUES ('$newStr')";
    

    我还建议你检查mysql_query($query)的结果,如果有错误,你可以检查错误信息:

    if (!mysql_query($query))
    {
        trigger_error(mysql_error());
    }
    

    你也应该考虑使用MySQL的新接口之一。 旧的mysql_*函数已弃用,不应在新代码中使用。

    链接地址: http://www.djcxy.com/p/16739.html

    上一篇: Best use and practice of escaping strings

    下一篇: Protection against SQL injection