【问题标题】:How do you escape quotes in a sql query using php?如何使用 php 在 sql 查询中转义引号?
【发布时间】:2010-07-15 05:16:13
【问题描述】:

我有一个问题

$sql ="SELECT CustomerID FROM tblCustomer 
WHERE EmailAddress = '".addslashes($_POST['username']) ."' AND Password = '".addslashes($_POST['password']) ."'";

//  while printing,   it will be

SELECT CustomerID FROM tblCustomer WHERE EmailAddress = 'test@ab\'c.com' AND Password = '123'

如果我们在 mysql 服务器中执行它,它可以工作,但不能在 sql 服务器中

解决办法是什么? .我正在使用 sql server

【问题讨论】:

  • 您能否清楚您是否想知道这是如何在 MySQL 或 SQL Server 中完成的?看起来您确实想要后者,尽管您的标签另有说明。
  • 我想在 SQL Server 中使用它
  • Addslashes 从来都不是安全的,因此已从 PHP 中删除。您需要找到 15 年以内的教程或其他 PHP 信息来源。

标签: php sql-server


【解决方案1】:

addslashes() 将使用前导反斜杠转义单引号,这在 MySQL 中是有效的语法,但在 MS SQL Server 中是无效的。在 MS SQL Server 中转义单引号的正确方法是使用另一个单引号。对 MySQL 使用 mysql_real_escape_string()mysql_escape_string() 已被弃用)。不幸的是,不存在类似的mssql_ 函数,因此您必须使用str_replace()preg_replace() 或类似的东西自己滚动。更好的是,使用支持参数化查询的数据库中立抽象层,例如 PDO。

【讨论】:

  • 我会 +1 你,除了你链接到同一个半途而废的“引用”功能,我刚刚投了两次反对票。
  • @cHao:我在链接之前没有仔细看那个函数。我没有注意到它正在破坏数据。感谢您向我指出这一点。我已经从我的回答中删除了攻击性功能的链接。
  • PHP 7 更新:此扩展在 PHP 5.5.0 中被弃用,并在 PHP 7.0.0 中被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展。此函数的替代方法包括:mysqli_real_escape_string()、PDO::quote()
【解决方案2】:

对于 MySQL,您想使用mysql_real_escape_stringaddslashes 做了几乎相同的事情,并且字母更少,但显然它有一些错误——不要使用它。

对于 SQL Server,它有点复杂,因为 (1) MySQL 引用非标准的东西,以及 (2) 我没有看到为 SQL Server 引用东西的函数。但是,以下内容应该适合您...

$escaped_str = str_replace("'", "''", $unsafe_str);

【讨论】:

  • addslashes() 是为不同的目的而设计的,并且在一个微妙的情况下出错了。不要将它用于 MySQL 的转义。
  • @staticsan:我有点认为有一个完整的其他函数(具有已弃用的先前版本!)来引用 MySQL 字符串是有原因的。 +1 提及它。 :) 相应地编辑了我的答案。
【解决方案3】:

对于mysql

使用mysql_real_escape_string

http://php.net/manual/en/function.mysql-real-escape-string.php

喜欢:

// Query
$query = sprintf("SELECT * FROM tblCustomer WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

对于 mssql

在这里查看答案:

How to escape strings in SQL Server using PHP?

【讨论】:

  • 这仅适用于 MySQL,不适用于 MS SQL Server。发帖人似乎也想要一个适用于 MS SQL Server 的解决方案。
  • 如果我们这样做,查询将输出 SELECT * FROM tblCustomer WHERE EmailAddress='' AND Password='' // 表单值不会从 mysql_real_escape_string 输出
  • 我希望我能再次否决这个答案。您的 ms_escape_string 函数是我为自己做的事情而自豪的那种东西——数据应该由调用者验证,如果有效,应该将其发送到数据库 未修改 .
  • 它的例子我链接到原始问题。
  • @haim evgi:我也对你的例子的来源投了反对票。任何引用函数都不应该破坏数据——它的全部目的是看到数据进入数据库而不受数据库引用语法的影响。
【解决方案4】:

您不应该真正动态地构建 SQL 语句,因为它很危险(并且没有必要)。正确的做法是使用参数化查询见http://msdn.microsoft.com/en-us/library/cc296201%28SQL.90%29.aspx

$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? AND Password = ?";
$stmt = sqlsrv_query( $conn, $sql, array($_POST['username'], $_POST['password']));

这更安全,意味着您不必担心转义字符。另一件事是要注意区分大小写/不区分大小写的比较。例如,如果您希望电子邮件地址不区分大小写但密码区分大小写,请使用以下内容:

$sql ="SELECT CustomerID FROM tblCustomer WHERE EmailAddress = ? COLLATE SQL_Latin1_General_CP1_CIAI AND Password = ? COLLATE SQL_Latin1_General_CP1_CSAS";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2016-06-13
    • 2011-01-03
    • 2016-03-16
    相关资源
    最近更新 更多