2

多くの HTML ページからできるだけ多くの Javascript リダイレクトをキャッチしようとしています。私の正規表現は次のとおりです。

((location.href)|(window.location)|(location.replace)|(location.assign))(( ?= ?)|( ?\( ?))("|')([^'"]*)("|')( ?\) ?)?;

私はPythonを使用していますが、質問は一般的です:

regex = re.compile(r"""((location.href)|(window.location)|(location.replace)|(location.assign))(( ?= ?)|( ?\( ?))("|')([^'"]*)("|')( ?\) ?)?;""", re.I)
# ... some control here ...
print re.search(regex, html).group(10)  # 10 is the pure url

いくつかのテストを行ったところ、これらすべてのケースをキャッチできました。

location.href = "http://www.foo.com";
location.href="http://www.foo.com";
window.location = "http://www.foo.com";
window.location.href = "http://www.foo.com";
location.replace ("http://www.foo.com");
location.replace( "http://www.foo.com" ) ;
location.assign ("http://www.foo.com");

コードに変数が含まれているために URL を解決できないところはスキップします。

location.href = "http://www.foo.com" + var + "something else";

質問は次のとおりです。

  1. Javascript を使用してリダイレクトする他の方法はありますか? location.somethingelse私が見逃しているものは他にありますか?
  2. これら4つのケースをキャッチする方法は正しいですか? (二重) 引用符が原因で見逃すようなものを使用することは許可されていますlocation.href = http://www.foo.com;か? location.replace (http://www.foo.com);私は厳しすぎるか、それとも緩すぎますか?
  3. 私の正規表現はうまく書かれていますか?それとも何らかの方法で改善できますか?
4

1 に答える 1

0

一般に、正規表現を使用してプログラミング言語を解析することはできません (理論的には可能ですが、非常に非現実的です)。これは、非常に動的な性質を持つ JavaScript に特に当てはまります。例えば、

 window['loc' + 'a' + 'tion'][['h','r','e','f'].join('')] = 'something'.replace(/s/, etc...)

そうは言っても、少なくともテストに合格する式は次のとおりです(わかりやすくするために分解されています)。

# quoted string
str = r"""
    ' (?:\\.|[^'])* '
    |
    " (?:\\.|[^"])* "
"""
# dotted reference to "location"
loc = r"""
    (?: \w+\.)*
    \b location \b
    (?: \.\w+)*
"""

# ref=string or ref(string)
expr = r"""
    ({0})
    \s*
    (?:
        = \s* ({1})
        |
        \( \s* ({1}) \s* \)
    )
    \s*
    ;
""".format(loc, str)

これを拡張モードでコンパイルします。

expr = re.compile(expr, re.X)
于 2012-11-13T15:15:23.857 に答える