从清洁HTML标记所有内嵌事件(Cleaning all inline events from HT

2019-07-31 21:33发布

对于HTML的输入,我想中和具有内联JS所有的HTML元素(的onclick =“...‘的onmouseout =’...”等)。 我在想,是不是足够编码以下字符? =,(,)

所以的onclick = “location.href = 'ggg.com'”
将成为的onclick%3D “location.href%3D'ggg.com'”

我缺少的是在这里吗?

编辑:我确实需要接受积极HTML(我无法逃避这一切或实体是它)。

Answer 1:

有没有简单的方法来接受HTML,而不是脚本。

你必须解析HTML DOM的,删除DOM所有不必要的元素和属性,并生成新的HTML。

它不能使用正则表达式做可靠

on *属性是不够的。 脚本可以被嵌入stylesrchref和其他属性。

如果你使用PHP,然后使用HTML过滤 。



Answer 2:

你可能有几个选项...最简单的方法就是报价转换,并可能<>人物,他们的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: ")')"

在这种情况下,你可能想编写一个循环,通过字首先解析字符串(即,寻找事件处理程序名称),然后通过文字去的性格,保持你去报价水平,并保持跟踪的一些轨迹当前分隔符:

  1. 标记处理程序名称的开头索引(在中的onclick“O”等)
  2. 开始报价水平为0(或1你处理开盘分隔符之后)。
  3. 如果当前的分隔符是“你看‘然后由1提高报价水平和当前的分隔符切换到’。
  4. 如果当前的分隔符是“你看”,由1降低报价水平和开关电流分隔符”。
  5. 如果当前的分隔符是“你看”,然后由1提高报价水平和开关电流分隔符”。
  6. 如果当前的分隔符是“你看”,通过1降低报价水平和当前的分隔符切换到”。
  7. 如果报价水平得到回落到0,那么你的字符串结束。 标记的字符串的结束位置的索引。
  8. 使用字符串处理函数从第一个索引切出的子串的最后一个索引。

这是一个有点费时,但它应该从理论上工作不管是什么,假设HTML是良好的。 (这是一个可怕的假设,但如果它不能很好地形成的,你可以只拒绝输入反正!)

[1] http://us3.php.net/manual/en/function.htmlspecialchars.php



文章来源: Cleaning all inline events from HTML tags