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

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行附近使用!"#!#^!"#!"#!"#^''''''


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

3
mysql_*函数即将被弃用,请使用PDOMySqli - Lion
2个回答

7

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


你如何创建一个带参数的查询? - Oskar Persson
使用 PDO 进行参数化查询。 - Lion
请查看Lion发布的链接中的连接部分。 - Kylotan

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_*函数已经弃用,不应在新代码中使用。


“table” 实际上是表示表名的,所以它是可以的...(“username” 是字段名) - Shomz
感谢您的评论。我已将其添加到需要修复的代码行列表中。 - Mark Byers
干得好,不能再给你另一个+1 :) - Shomz
请检查已编辑的第一篇帖子。 - Oskar Persson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接