何时使用哪种字符串转义方法?

时间:2011-04-24 13:58:21

标签: php security

好的,所有这些不同的字符串转义函数,例如htmlentities()mysql_real_escape_string()addslashes()

但是我应该在什么情况下使用哪种? 资源和意见请:)

4 个答案:

答案 0 :(得分:9)

  • addslashes()/ stripslashes()又回到了一个名为'Magic Quotes'的坏主意,后来被弃用了。它会自动转义特殊字符,然后您可以使用addslashes()和stripslashes()来添加或删除它们。其中一个问题是你从来没有确定数据当前是否有斜线,因此你最终将非转义数据放入SQL,或者在你的网页上有额外的斜杠。
  • htmlentities()经常用于在页面上显示HTML。如果您尝试将<b>Something</b>写入HTML页面,您只会看到 Something (即原始文本以粗体显示) - 您将看不到它周围的粗体标记。使用htmlentities('<b>Something</b>')将代码转换为&lt; b&gt; Something&lt; b&gt;所以在浏览器中你会看到三角括号。
  • mysql_real_escape_string()对于防御MySQL注入攻击非常有用 - 它可以逃避字符串中的不安全字符。它在其他数据类型中转义任何内容,因此需要单独处理。它也不编码%和_,它们在某些查询中用作通配符。

总结:

  • 如果您要编码以写入HTML页面,请使用htmlentities()
  • 如果您要编码字符串以写入数据库,请使用mymysql_real_escape_string()
  • 永远不要使用addslashes()

答案 1 :(得分:3)

  

我应该在什么情况下使用?

  • ヶ辆()。从不使用它,但是htmlspecialchars()。用于将不受信任的用户输入打印到浏览器中。
  • mysql_real_escape_string是mysql数据库特定的功能。这里是a comprehensive guide I wrote exactly on topic使用它的地方和不需要的地方以及你需要知道的关于mysql数据库安全的其他内容
  • 和addslashes()。这取决于。大多数时候你根本不需要它

答案 2 :(得分:1)

将数据插入mysql数据库时请使用:

mysql_real_escape_string()

当您要显示用户提供的内容时:

htmlentities()

如果您的数据库在php中没有自己的功能,您可以使用: addslashes(),但不建议在具有更好的特定内容时使用(mysql_real_escape_string())。

有关详细信息,请参阅此处:

Htmlentities vs addslashes vs mysqli_real_escape_string

P.S你应该使用mysqli_real_escape_string(),而不是mysql_real_escape_string()。

编辑:

要真正防止攻击,这是一本很好的阅读材料:http://www.php.net/manual/en/security.database.sql-injection.php ...

您还应该查看准备好的陈述:http://www.php.net/manual/en/mysqli.prepare.php

这里有很多关于堆栈溢出的信息。

答案 3 :(得分:0)

这是同一主题的变体:

$bar = "O'Reilly";
"foo = '$bar'";  // foo = 'O'Reilly' -> invalid syntax

如果字符串应遵循特殊语法,则将字符串盲连接在一起可能会导致语法违规。充其量这是一个烦恼,最糟糕的是安全问题。转义值可以防止出现这些问题。通用示例:

"foo = '" . escape($bar) . "'";  // foo = 'O\'Reilly'

所有不同的函数都是针对不同的语法正确转义值:

htmlentities用于转义HTML的输出 mysql_real_escape_string用于转义SQL查询的值 addslashes ...对任何事情都没有好处,不要使用。
json_encode用于编码/转义/转换Javascript格式的值。