2012-11-13 44 views
2

我試圖從許多HTML頁面捕捉儘可能多的Javascript重定向。我的正則表達式是:正則表達式捕捉儘可能多的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"); 

,並跳過其中,因爲代碼包含一個變量,我不能解析的網址:

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. 我的正則表達式編寫得好嗎?或者我能以某種方式改進它?
+2

還有'document.location' – mrk

+0

謝謝,我忘了! – Luca

+0

該URL應該在雙引號或單引號之間。你需要檢查兩者,因爲它們都是用JavaScript封裝字符串的有效方法。 –

回答

0

一般來說,你不能用正則表達式解析編程語言(理論上,you can,但它是非常不切實際的)。對於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) 
+0

我對這種類型的權宜之計不感興趣,但謝謝。我正在做一個額外的檢查,如果一個網站管理員在其頁面中執行此操作,他應該被排除在我的列表中:) – Luca