2

当我将变量发布到数据库时,当然,我使用mysql_real_escape_string. 这样特殊字符就应该进入数据库。

当我从数据库中读取这个变量时,我再次使用 mysql_real_escape_string 和stripslashes

$var = stripslashes(mysql_real_escape_string($record['rowname']));

否则它会在引号前给我斜杠。

当我使用$var上面提到的这个并想要回应它时,我很简单,echo "$var"因为它已经被剥离和转义了,对吧?

此外,如果我在一个变量上使用stripslashes+ mysql_real_escape_string,然后在数据库中再次发布这个相同的变量,就mysql_real_escape_string足够了吗?还是我需要stripslashes再次使用这个变量?

总结:

据我所知这是如何工作的:

  1. 在 mysql 中使用数据时mysql_real_escape 每次都使用:当通过变量读取查询时,就像将变量发布到数据库一样。
  2. stripslashes在回显转义变量时使用。
  3. 如果您想stripslashes再次向数据库发布和转义变量,则不需要再次删除它。

我想念htmlspecialchars吗?

编辑

所以这一切都错了吗?

    while( $record=mysql_fetch_array($result) ) 
    {
        $custid=mysql_real_escape_string($record['custid']);
        $custsurname=mysql_real_escape_string($record['custsurname']);
        $custmidname=mysql_real_escape_string($record['custmidname']);
        $custforename=mysql_real_escape_string($record['custforename']);
        $custcountry=stripslashes(mysql_real_escape_string($record['custcountry'])); }
4

2 回答 2

6

恐怕你做错了。关键是转义是上下文相关的,你完全无视这个事实。

在每种数据格式中,都有在格式规范中被赋予特殊含义的单词或字符。例如,'SQL 中的符号表示“字符串分隔符”,?URL 中的符号表示“开始查询字符串” <,HTML 中的符号表示“开始标签”。当你想插入一个文字或字符时,你需要转义,即你想按原样插入它并删除它的特殊含义。

一旦意识到这一点,很明显语法会因格式和上下文而异。<在 HTML 中表示“开始标签”,但在 SQL 或 URL 中不表示。因此,您需要使用为目标格式构建并遵循格式规则的转义方法。

如果您mysql_real_escape_string()对从数据库读取的数据执行此操作,则您说的是“转义我的数据,以便可以将其注入 SQL 字符串中”。您的数据已准备好在内部用作 SQL 字符串,但因任何其他用途而损坏。

在这个例子中,碰巧stripslashes()撤消了大部分所做的事情mysql_real_escape_string(),所以你最终得到一个基本上没有改变的输出。但这纯粹是机会。

最后但同样重要的是,不得不一一转义数据库输入参数是非常烦人的。所有其他数据库扩展,但您使用的那个1提供准备好的语句。不要被不推荐使用的不提供现代内容的扩展卡住。

1注意:遗留的 mysql 扩展已经被弃用了好几年,当更好的替代品出现时,它不再是语言的一部分。

更新:稍微澄清一下——转义只是一个语法技巧。您不会更改目标引擎的输入,它只会按原样查看原始数据。因此,在检索输入时无需对输入进行转义。

于 2012-11-23T11:17:46.233 回答
4

您不需要stripslashesmysql_real_escape_string来自数据库的数据,您只需要在查询之前对其进行转义,以便查询解析器知道什么是特殊字符和什么是文字字符。

stripslashes永远不应该使用(作为修复某些症状的技巧),如果您在转义后需要一个变量,请使用原始变量:

$data_safe = mysql_real_escape_string( $data );
//$data can still be used normally

转义仅适用于特定上下文,如果上下文是 mysql 查询,那么您将 mysql 真正转义仅用于查询,仅此而已。如果上下文是 html 输出,那么您将在将字符串输出为 html 之前进行 htmlescape。在任何时候您都不想实际修改数据本身。如果你误解了这一点,你会看到O\'Brian等等O&#39;Brian

于 2012-11-23T11:11:35.967 回答