在变量(由人工输入填充)上使用FILTER_SANITIZE_STRING
时,我遇到了一个奇怪的问题。它似乎剥离了<
字符以及之后出现的任何文本。 <{1}}字符保持不变。
我认为它认为>
是一个需要被剥离的HTML标记,但是它后面没有结束标记,所以我不知道它为什么会这样。有没有办法让它离开<
到位,并且仍然按照应有的方式消毒?
答案 0 :(得分:4)
根本问题是当您使用FILTER_SANITIZE_STRING
去除HTML标记时,您将输入作为HTML处理。根据您的描述,您的输入是纯文本。因此,过滤器只能破坏输入数据,因为用户已经报告过。
虽然它似乎是一种非常流行的技术,但我从未理解在纯文本上将HTML标签作为清理方法进行条带化的概念。如果它不是HTML,则不需要关心HTML标记,原因与您不需要关心SQL关键字或命令行命令的原因相同。它只不过是数据。
但是,当然,当你将字符串注入HTML之后,你需要将其转义以确保:
这就是htmlspecialchars()存在的原因。类似地,当您动态生成任何其他类型的代码时,您需要使用相应的转义机制:SQL,JavaScript,JSON ......