【问题标题】:PHP/MySQL - Best use and practice of escaping strings [duplicate]PHP/MySQL - 转义字符串的最佳使用和实践
【发布时间】:2012-07-13 21:32:05
【问题描述】:

可能重复:
Best way to prevent SQL Injection in PHP

进行查询时转义字符串的最佳方法是什么? 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_* 函数即将被弃用。使用PDOMySqli

标签: mysql string escaping


【解决方案1】:

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

【讨论】:

  • 你如何进行参数化查询?
  • 使用PDO的参数化查询。
  • 查看 Lion 发布的链接的连接部分。
【解决方案2】:

像这样使用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_* 函数是deprecated,不应在新代码中使用。

【讨论】:

  • table 实际上没问题,因为它代表表名...(username 是字段名)
  • 感谢您的评论。我已将其添加到需要在该代码行中修复的内容列表中。
  • 干得好,不能再给你+1 :)
  • 检查编辑的第一篇文章。
猜你喜欢
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2014-02-06
相关资源
最近更新 更多