您可能有几个选择...最简单的方法是将引号和可能的 字符转换为它们的 HTML 编码等效项(" 等),这将导致 HTML 代码按字面意思显示。
告诉我您使用的是哪种服务器端语言,如果您愿意,我可以为您提供更多特定于语言的信息。 (例如,PHP 有 htmlspecialchars()[1])。
编辑:我实际上只是阅读了您的问题。好的,您想允许 HTML 通过但不允许 JavaScript?好吧,由于我没有想到一个简单的解决方案,我建议只使用字符串替换(如果可以的话,使用正则表达式,也许?)来完全摆脱它们。
JavaScript 中有一组有限的事件处理程序属性。再加上对引号的需求,你可能很好。
对于概念证明,在 Perl 中,您可能会这样做:
$myInput =~ s/on(mouseover|mouseout|click|focus|blur|[...])(\"[^\"]*\")|(\'[^\']*\')\s*//gi;
因此,捕获事件处理程序名称(我只包括其中的一部分),然后是使用单引号或双引号的带引号的表达式,最后有可选的空格,然后将整个内容替换为空(即删除它) .
不过,这不适用于需要更多引用级别的内容,因为最终您会回到原来的分隔符。原谅这个人为的、完全没用的例子:
onclick="eval('3+prompt("Enter a number: ")')"
在这种情况下,您可能需要编写一个循环,首先逐字解析字符串(即,查找事件处理程序名称),然后逐个字符地解析,同时跟踪引用级别的数量,然后跟踪当前分隔符:
- 标记处理程序名称开头的索引(onclick 中的“o”等)
- 从引用级别 0 开始(或在处理了起始引号分隔符后为 1)。
- 如果当前分隔符是 " 并且您看到 ',则将引用级别增加 1 并将当前分隔符切换为 '。
- 如果当前分隔符是“并且您看到了”,请将引用级别降低 1 并将当前分隔符切换为 '。
- 如果当前分隔符是 ' 并且您看到 ",则将引用级别增加 1 并将当前分隔符切换为 '。
- 如果当前分隔符是 ' 并且您看到了 ',请将引用级别降低 1 并将当前分隔符切换为 '。
- 如果引用级别恢复到 0,则您的字符串已结束。标记字符串结束位置的索引。
- 使用字符串操作函数将子字符串从第一个索引剪切到最后一个索引。
这有点费时,但理论上无论如何它都应该工作,假设 HTML 格式正确。 (这是一个可怕的假设,但如果它的格式不正确,你无论如何都可以拒绝输入!)
[1]http://us3.php.net/manual/en/function.htmlspecialchars.php