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

Php 何时使用哪个字符串转义方法?,php,security,Php,Security,好的,这里有所有这些不同的字符串转义函数,比如htmlentities(),mysql\u real\u escape\u string(),addslashes() 但是在什么情况下我应该使用哪一种呢? 参考资料和意见请:)这都是同一主题的变体: $bar = "O'Reilly"; "foo = '$bar'"; // foo = 'O'Reilly' -> invalid syntax 如果字符串应该遵循特殊语法,那么盲目地将字符串连接在一起可能会导致语法冲突。充其量这是一个令人

好的,这里有所有这些不同的字符串转义函数,比如
htmlentities()
mysql\u real\u escape\u string()
addslashes()

但是在什么情况下我应该使用哪一种呢?

参考资料和意见请:)

这都是同一主题的变体:

$bar = "O'Reilly";
"foo = '$bar'";  // foo = 'O'Reilly' -> invalid syntax
如果字符串应该遵循特殊语法,那么盲目地将字符串连接在一起可能会导致语法冲突。充其量这是一个令人烦恼的问题,充其量这是一个安全问题。转义值可以防止这些问题。一般示例:

"foo = '" . escape($bar) . "'";  // foo = 'O\'Reilly'
对于不同的语法,所有不同的函数都正确地转义值:

htmlentities
用于转义HTML的输出。
mysql\u real\u escape\u string
用于为SQL查询转义值。
addslashes
…没有什么用处,不要使用。

json\u encode
用于编码/转义/转换Javascript格式的值。

将数据插入mysql数据库时,请使用以下命令:

mysql_real_escape_string()
当您要显示用户提供给您的内容时:

htmlentities()
如果您的数据库在php中没有自己的功能,您可以使用:
addslashes()
,但当您有更好的特定内容(mysql\u real\u escape\u string())时,不建议使用它

有关更多信息,请参见此:

另外,你应该使用mysqli\u real\u escape\u string(),而不是mysql\u real\u escape\u string()

编辑:

为了真正防止攻击,这是一本很好的阅读材料:

您还应查看准备好的报表:

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

  • addslashes()/stripslashes()追溯到一个叫做“魔术引号”的非常糟糕的想法,该想法后来被弃用。它会自动转义特殊字符,然后您可以使用addslashes()和stripslashes()添加或删除它们。其中一个问题是,您从来都不太确定数据当前是否有斜杠,因此您最终将未经斜杠处理的数据放入SQL,或者在web页面上有额外的斜杠
  • htmlentities()通常用于在页面上显示HTML。如果您试图在HTML页面中写入
    Something
    ,您只会看到一些内容(即原始文本以粗体显示)-您不会看到它周围的粗体标记。使用
    htmlentities('Something')
    将代码转换为某些内容,以便在浏览器中看到三角形括号
  • mysql\u real\u escape\u string()对于防御mysql注入攻击非常有用-它可以转义字符串中的不安全字符。它不会转义其他数据类型中的任何内容,因此需要单独处理这些数据类型。它也不编码%和x,它们在某些查询中用作通配符
总之:

  • 如果要编码以写入HTML页面,请使用htmlentities()
  • 如果要对字符串进行编码以写入数据库,请使用mymysql\u real\u escape\u string()
  • 永远不要使用addslashes()
在什么情况下我应该使用哪一种

  • htmlentities()。永远不要使用它,但是
    htmlspecialchars()
    。用于将不受信任的用户输入打印到浏览器中
  • mysql\u real\u escape\u string是mysql数据库特有的函数。下面是在哪里使用它,在哪里不使用它,以及关于mysql数据库安全性您还需要知道什么
  • addslashes()。视情况而定。大多数时候你根本不需要它

你在mysql\u real\u escape\u string()描述上错了两个人认为Blowski的mysql\u real\u escape\u string()描述错了,zero解释了原因。那不好…@thasc,这不会有帮助的。因为这里的每个人都不要求(也不要求)理解,只要求一份食谱。但是一个不懂的食谱总是让你失望。伙计们,让我们把这里的温度降低几百度。(旗帜,他们来了,因为这看起来更像是一场拳击比赛,而不是一场建设性的对话)@TimPost-只为你。。。当您将字符串数据插入mysql数据库时,请使用以下命令。但它对数字没有影响,因为数字不需要转义。。。(也许他们需要验证,但这取决于你自己的数据库)按照你的答案,一个是开放的注射。这就是重点。是的,我在5分钟前的回答中添加了php安全部分。。。你是对的,我最初的回答不好。这是为什么?:
htmlentities()。永远不要使用它,但是htmlspecialchars()
我们谈论的是如何正确转换输出?手册中没有说“永远不要使用htmlentities()”。也许这对OP很重要,因为他似乎很困惑。我的结论是,它们是为不同的目的而设计的不同函数,但简单地说“不应该使用htmlentities()”,而不解释为什么我确信这对OP没有帮助。@Madmartigan:根本不需要:只需使用适当的字符集(在大多数情况下:UTF-8),并确保输出的源使用它
htmlentities
只会增加额外的带宽,不会使页面更安全。@Madmartigan但正如@Marcel所说,使用
htmlentities()
没有任何意义。它不会降低任何东西的安全性,但也没有任何优势,而且在XML上下文中(XML不知道HTML的实体)它会破坏东西
htmlspecialchars()
是正确的使用方法。另外,htmlentities()它经常被错误地建议作为解决编码问题的方法,而不是解决实际问题,这就是为什么我赞成阻止它的原因。请仔细阅读答案。大多数人根本不知道自己在说什么。大多数被否决的答案都充满了事实错误。与字符串转义无关,但与防止SQL注入有关:使用几乎总是比转义更好、更安全。@Joshwaa:注释中的输出转换函数摘要:htmlspecialchars()是首选。htmlentities()在大多数情况下都可以,但不是必需的,事实上,它可能会在XML文档中引起问题,也可能被滥用来修复可能出现的错误