PHP/MySQL - 转义字符串的最佳用法和实践

Osk*_*son 8 mysql string escaping

可能重复:
在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);
?>
Run Code Online (Sandbox Code Playgroud)

编辑:

现在我有这个代码:

      $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));
Run Code Online (Sandbox Code Playgroud)

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

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

Kyl*_*tan 7

最好的方法是不要转义字符串,而是使用参数化查询,它在幕后为您完成.


Mar*_*ers 6

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

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

试试这个:

$query = "INSERT INTO yourtable (username) VALUES ('$newStr')";
Run Code Online (Sandbox Code Playgroud)

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

if (!mysql_query($query))
{
    trigger_error(mysql_error());
}
Run Code Online (Sandbox Code Playgroud)

您还应该考虑使用MySQL的一个较新的接口.旧mysql_*函数已弃用,不应在新代码中使用.