RegEx查找和删除事件属性ex。 onclick,onload,onhover等

时间:2017-07-14 17:17:22

标签: php regex

我已经在这里开了几天,但我的RexEx掌握并不是很好。是的,我理解RegEx不是用于解析HTML。我正在做服务器端"清洁" CKEditor输入,已经这样做了,但只有客户端。

在剥离没有列入白名单的标签后......

首先:$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html); 删除所有使用'"引号正确引用的事件属性

第二:$html = preg_replace(' on\w+=\S+', '', $html); *删除没有引号但仍然可以触发的那些,例如。的onclick = blowUpTheBase()

我想要做的是确保onEvent介于<&amp; >但是如果onEvent属性是标记之后的第一个属性,我只能使它工作。我尝试的所有内容最终都会捕获大部分代码。我只是不能让它变得懒惰。

离。 $html = preg_replace('<([\s\S]?)( on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);

编辑: 我将选择@ colburton的答案,因为RegEx就是我要求的。我也将它用于我的特殊情况,因为它将由于这个伎俩。 (无论如何,这是一个内部应用程序)

BUT

我要感谢@Casimir et Hippolyte的answer因为它提供了一个很好的例子和解释,说明了如何做到这一点&#34;正确的方式&#34; 。我将在短时间内使用DOMDocument编写一个函数,它将成为我处理RTE / WYSIWYG / HTML输入的方法。

1 个答案:

答案 0 :(得分:1)

也许我应该从一开始就提到这一点:这不是你应该如何尝试过滤XSS。这在您提出的参数范围内纯粹是学术性的(例如“使用RegEx”)。

这让你非常接近:

preg_replace('/(<.+?)(?<=\s)on[a-z]+\s*=\s*(?:([\'"])(?!\2).+?\2|(?:\S+?\(.*?\)(?=[\s>])))(.*?>)/ig', "$1 $3", $string);

经过测试

<a href="something" onclick="bad()">text</a> onclick not in tags
<a href="something" onclick=bad()>text</a>
<a href="something" onclick="bad()" >text</a>
<meta name="keywords" content="keyword1, keyword2, keyword3">

<a href="something" onclick= "bad()">text</a> onclick not in tags
<a href="something" onclick =bad()>text</a>
<a href="something" onclick=bad('test')>text</a>
<a href="something" onclick=bad("test")>text</a>
<a href="something" onclick="bad()" >text</a>
What if I write john+onelia=love forever?

在这里玩: https://regex101.com/r/GMBaQs/9