【问题标题】:Undo mysql_real_escape_string撤消 mysql_real_escape_string
【发布时间】:2013-08-02 16:55:36
【问题描述】:

我在每个 php 页面的顶部都有以下代码:

<?php

    function name_format($str)
    {
        return trim(mysql_real_escape_string(htmlspecialchars($str, ENT_QUOTES)));
    }
?>

foreach ($_POST as $key => $value) {
        if (!is_array($value))
        {
            $_POST[$key] = name_format($value);
        }
    } 

到目前为止,这非常有用。我经历过,如果我想在将&lt;textarea&gt; 中的文本写入数据库之前显示它,那么它会显示“\r\n”而不是正常的换行符。 即使我尝试执行以下操作,它也不起作用:

$str = str_replace("\r\n", "<br>", $str);

【问题讨论】:

  • 一开始就不做会比做和撤消更好吗? :) mysql_real_escape_string() 实际上应该仅用于在进行查询之前转义数据
  • 你为什么分配$_POST?这真是一件很奇怪的事情。
  • 使用mysql_real_escape_string(或者更好的PDO)来清理输入的字符串。单独htmlspecialchars 应该足以清理字符串用于输出
  • 一个选项是使用 PDO 或 mysqli,那么您根本不必转义字符串。 Mysql_* 函数也被弃用了。
  • @bestprogrammerintheworld 这有点误导。您的意思是“始终使用参数化查询”。在这两个库中使用任意动态字符串仍然是可能的(有时是可取的)。参数化查询也不意味着您不应该考虑其他类型的转义,例如 HTML 或 URL 参数。正如我试图在我的回答中解释的那样,考虑什么转义适合特定的上下文总是很重要的。

标签: mysql line-breaks


【解决方案1】:

您在这里犯的错误是用您希望适合所有上下文的字符串版本覆盖$_POST(使用mysqli_real_escape_stringhtmlspecialchars at同时)。

您应该保持原始值不变,并在使用它的地方转义,使用适合该上下文的函数。 (这就是为什么 PHP 早期版本的“魔术引号”功能被普遍认为是一个坏主意的原因之一。)

因此,在您的数据库代码中,您将准备一个用于 SQL(特别是 MySQL)的变量:

$comment = mysqli_real_escape_string(trim($_POST['comment']));

在您的模板中,您将准备一个用于 HTML 的变量:

$comment = htmlspecialchars(trim($_POST['comment']));

可以根据需要在 HTML 上下文中添加对 nl2br() 的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2014-04-12
    • 2013-06-06
    • 2014-03-03
    • 2013-07-29
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多