FILTER_SANITIZE_STRING正在剥离<字符和后面的任何文字

时间:2013-04-13 14:55:38

标签: php

在变量(由人工输入填充)上使用FILTER_SANITIZE_STRING时,我遇到了一个奇怪的问题。它似乎剥离了<字符以及之后出现的任何文本。 <{1}}字符保持不变。

我认为它认为>是一个需要被剥离的HTML标记,但是它后面没有结束标记,所以我不知道它为什么会这样。有没有办法让它离开<到位,并且仍然按照应有的方式消毒?

1 个答案:

答案 0 :(得分:4)

根本问题是当您使用FILTER_SANITIZE_STRING去除HTML标记时,您将输入作为HTML处理。根据您的描述,您的输入是纯文本。因此,过滤器只能破坏输入数据,因为用户已经报告过。

虽然它似乎是一种非常流行的技术,但我从未理解在纯文本上将HTML标签作为清理方法进行条带化的概念。如果它不是HTML,则不需要关心HTML标记,原因与您不需要关心SQL关键字或命令行命令的原因相同。它只不过是数据。

但是,当然,当你将字符串注入HTML之后,你需要将其转义以确保:

  1. 您的数据按原样显示
  2. 结果仍然有效HTML
  3. 这就是htmlspecialchars()存在的原因。类似地,当您动态生成任何其他类型的代码时,您需要使用相应的转义机制:SQL,JavaScript,JSON ......