XSS过滤器以避免形式注入匹配它不应该匹配的字符串

时间:2018-01-23 10:41:27

标签: regex grails xss

我正在使用this Grails 3 plugin从用户输入中清除XSS。它使用正则表达式来过滤掉不需要的内容。其中一个表达式是:

<(.*?)form(.*?)>(.*?)</(.*?)form(.*?)>

它的目的是剥离注入的恶意表格。代码提交说:

// Avoid any form injection with <...form ...> ... </form ...> tag

然而,这个表达太宽泛了。例如,它匹配以下无害字符串:

<p>Refactoring is the disciplined process of improving design qualities without changing the external behaviour of the code. To refactor a big piece of code means to apply small transformation that keep the behavior unchanged. When refactoring, the code should work every 5-7 minutes. It's not refactoring if you can't run the code for hours or days.</p><p><br></p><p>In this session, we will take a deep dive into the refactoring transformations. I will demonstrate:</p><p>&nbsp; &nbsp;how to pick the next transformation</p><p>&nbsp; &nbsp;how small the transformations are</p><p>&nbsp; &nbsp;how to use tools to make refactoring faster and</p><p>&nbsp; &nbsp;how local transformations lead to unexpected improvements in design</p>

问题是:剥离表单的正则表达式是什么?当然,如上所述的字符串应保持不变。

1 个答案:

答案 0 :(得分:1)

作为免责声明,我们通常不应该使用正则表达式来过滤嵌套的HTML内容(实际上是任何HTML)内容。但由于OP似乎正在使用这样做的工具,因此可能没有简单的解决方法。

以下模式似乎有效,仅在<form>标记上触发:

<([^<>]*)form([^<>]*)>(.*?)<\/([^<>]*)form([^<>]*)>

我对原始模式所做的主要更改是使标记内的匹配尽可能不贪婪和谨慎。您的示例文本很好,因为它包含单词transformations,导致您的原始模式出现误报。

Demo