-1

文字列にJavascriptが含まれていないことを確認するために、文字列をテストする必要がある正規表現は何ですか?

私はこの記事を出発点として使用しています。

  • ブロック単位のコード:

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

  • ":javascript"コード(例<a href="javascript:alert('hello')"):

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

  • Htmlタグ内のイベントハンドラー(例<div onmouseover=""):

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

4

1 に答える 1

1

HTMLの解析に正規表現を使用しないでください。javascriptが含まれていないことを確認できる場合もありますが、他の方法でひどく壊れないことを確認することはできません。代わりに、適切なパーサーを使用してください。

また、JavaScriptを含まない有効なHTMLでも、他の不快な要素(オーディオ、ビデオ、CSSノード、フォーム要素など)を含めることができます。許可するHTML要素にはホワイトリストを使用することをお勧めします。

コードがどのように見えるかの例を次に示します(疑似コードであると想定されていても、これは実際には適切な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で例外をスローできる場合に限ります(私が使用した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;
}

更新:コメントでリンクしたコードはこれを正確に行うと主張していますが、実際にそうなることを保証することはできません。

于 2013-01-23T11:32:50.710 に答える