mysql_real_escape_string,stripslashes和htmlspecialchars

时间:2012-11-23 11:03:42

标签: php mysql mysql-real-escape-string htmlspecialchars stripslashes

当我将变量发布到数据库时,我当然使用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,那么在数据库中再次POST同一个变量,mysql_real_escape_string是否足够?或者我需要再次stripslashes这个变量吗?

总结

我知道这是如何运作的:

  1. 在使用mysql数据时使用mysql_real_escape 每次时:通过变量读取查询时,就像将变量发布到数据库一样。
  2. 在回显转义变量时使用stripslashes
  3. 如果您想将stripslashes和转发的变量再次发布到数据库,则无需再次将其删除。
  4. 我想念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'])); }
    

2 个答案:

答案 0 :(得分:6)

我担心你做错了。关键是逃避是上下文敏感,你完全无视这一事实。

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

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

如果您对数据库中的数据读取进行mysql_real_escape_string(),则说“转义我的数据,以便将其注入SQL字符串中”。您的数据已准备好在内部用作SQL字符串,但在任何其他用途中都会被破坏。

在这个例子中,stripslashes()发生了mysql_real_escape_string()所做的大多数,所以你最终会得到一个基本不变的输出。但那是纯粹的机会。

最后但并非最不重要的是,必须逐个转义数据库输入参数非常烦人。所有其他数据库扩展,但您正在使用 1 的扩展提供预准备语句。不要被一个不提供现代东西的弃用扩展卡住。

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

更新:稍微澄清 - 逃避只是一种语法技巧。您不会改变目标引擎眼睛的输入,而目标引擎只能看到原始数据。因此,当您检索输入时,无需 unescape

答案 1 :(得分: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\'BrianO&#39;Brian等。