时间:2011-10-20 21:51:00

标签: php xss sanitization

我正在为我的网站创建一个聊天窗口小部件。用户将能够输入直接文本 - 没有html。

努力消除HTML标记 AND 以允许用户使用“<”和“>”,我正在输入并使用输入上的strip_tags()和输出到用户屏幕的htmlentities()使用php进行消毒。一个问题是如果用户输入“Russia< China”strip_tags()将贪婪地消除“<”之后的所有内容。

我的问题是......如果我使用正则表达式在“<”之间创建一个空格和下一个非空间角色,这有助于我消除XSS的威胁吗?它会阻止在用户屏幕上呈现潜在的HTML标记吗?

说,如果这样的事情滑倒了:

< script type ='text / javascript'> alert('some some code');< /脚本>

创建该空间的一个优点(例如< script ...>)似乎是strip_tags()将留下“<”单独

感谢您的任何建议。

2 个答案:

答案 0 :(得分:4)

添加的空间足以阻止标记被strip_tagsand from being rendered as HTML by browsers剥离。

但是你究竟会在什么时候使用这样的正则表达式呢?如果您在完成strip_tags()后添加,则合法文本已被删除。如果您在strip_tags()之前添加它,则不会有任何标记要删除,因此用户将在文本中看到间隔开的HTML标记。

但是,无论如何他们都会看到(损坏的)标签,你为什么要这样做呢?你可以做htmlspecialchars(),无论如何你必须这样做。

即使是HTML解析器也无法帮助您,因为HTML解析器也会将示例中的<China视为标记。

输入a<b进行比较,谈论HTML,试图增加重点或尝试注入恶意脚本的人是谁?

答案 1 :(得分:2)

只需使用htmlspecialchars()即可。它是清理HTML所需的唯一功能。如果你明智地使用它,XSS威胁就会被删除。如果要显示多行,请使用nl2br,否则文本将显示在一行上。

strip_tags 永远不会 清理 HTML的正确功能。充其量,它会吃掉或破坏某些有效的文本。在最坏的情况下,如果使用allowed_tags参数,它将不会清理任何内容,因为保留了属性。它也不会阻止HTML实体。