输入验证 - 匹配脚本的正则表达式

时间:2013-01-23 10:30:25

标签: regex validation xss

为了确保它不包含任何Javascript,我需要测试字符串的正则表达式是什么?

我正在使用此article作为起点。

  • 块中的代码:

    <script.*?>[\s\S]*?</.*?script>

  • “:javascript”代码(例如<a href="javascript:alert('hello')"):

    (?<=<.*)javascript.*:[^"]*

  • Html代码中的事件处理程序(例如<div onmouseover=""):

    on\w+="[^"]*"

1 个答案:

答案 0 :(得分:1)

不要使用正则表达式来解析HTML。您可能能够确保它不包含javascript,但您无法确保它不会以其他方式被严重破坏。相反,请使用正确的解析器。

此外,即使是不包含javascript的有效HTML仍然可以包含其他令人不快的元素(音频,视频,CSS节点,表单元素......),我建议您使用白名单来表示您允许的HTML元素。< / p>

以下是您的代码看起来如何的示例(请注意,即使它应该是伪代码,这实际上可能是正确的C#语法):

string[] tagWhitelist = ['strong', 'em', 'span' /*, ...*/];
string[] attrWhitelist = [/*...*/];

void function fixNode(DOMNode node, bool dieOnError){
   if(tagWhitelist.contains(node.type()){
      node.children.each((x) => fixNode(x))
      node.attributes
         .filter((x) => !attrWhitelist.contains(x))
         .each((x) => dieOnError ? throw new InvalidTagException() : x.remove())
   }else{
      dieOnError ? throw new InvalidAttrException() : node.remove()
   }
}

...

string output = fixNode(DOMParser.load(input, {strict:false}), false).toString();

这也可用于验证,但如果解析器能够在无效的HTML上抛出异常(我使用的那些总是尝试修复代码):

try{
   // note: if fixNode is only ever used to validate, don't use exceptions
   fixNode(DOMParser.load(input, {strict:true}), true);
   return true;
}catch(InvalidTagException, InvalidAttrException ex){
   return false;
}

更新:您在评论中链接的代码声称可以完成此操作,但我无法保证实际执行此操作。