对于HTML的输入,我想中和具有内联JS所有的HTML元素(的onclick =“...‘的onmouseout =’...”等)。 我在想,是不是足够编码以下字符? =,(,)
所以的onclick = “location.href = 'ggg.com'”
将成为的onclick%3D “location.href%3D'ggg.com'”
我缺少的是在这里吗?
编辑:我确实需要接受积极HTML(我无法逃避这一切或实体是它)。
对于HTML的输入,我想中和具有内联JS所有的HTML元素(的onclick =“...‘的onmouseout =’...”等)。 我在想,是不是足够编码以下字符? =,(,)
所以的onclick = “location.href = 'ggg.com'”
将成为的onclick%3D “location.href%3D'ggg.com'”
我缺少的是在这里吗?
编辑:我确实需要接受积极HTML(我无法逃避这一切或实体是它)。
有没有简单的方法来接受HTML,而不是脚本。
你必须解析HTML DOM的,删除DOM所有不必要的元素和属性,并生成新的HTML。
它不能使用正则表达式做可靠 。
on
*属性是不够的。 脚本可以被嵌入style
, src
, href
和其他属性。
如果你使用PHP,然后使用HTML过滤 。
你可能有几个选项...最简单的方法就是报价转换,并可能<>人物,他们的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: ")')"
在这种情况下,你可能想编写一个循环,通过字首先解析字符串(即,寻找事件处理程序名称),然后通过文字去的性格,保持你去报价水平,并保持跟踪的一些轨迹当前分隔符:
这是一个有点费时,但它应该从理论上工作不管是什么,假设HTML是良好的。 (这是一个可怕的假设,但如果它不能很好地形成的,你可以只拒绝输入反正!)
[1] http://us3.php.net/manual/en/function.htmlspecialchars.php