8

可能重复:
在 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 行的 ' !"#!#^!"#!" #!"#^''''''附近使用正确的语法

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

4

2 回答 2

7

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

于 2012-07-13T21:35:25.540 回答
6

像这样使用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_*功能已弃用,不应在新代码中使用。

于 2012-07-13T21:35:28.050 回答