钩子window.location。*分配和window.location.assign

时间:2018-09-04 16:27:33

标签: javascript hook

我正在尝试拦截Dim sfrm As Subform Select Case mainForm.tabLists.value Case List1.PageIndex Set sfrm = Me!subForm1 Case List2.PageIndex Set sfrm = Me!subForm2 Case List3.PageIndex Set sfrm = Me!subForm3 End Select sfrm.SetFocus 分配和window.location.*调用,以在离开前更改分配的url,这可能吗? 当我尝试重新定义属性设置器时,出现错误,我无法重新定义它。 我唯一的选择是代理页面并将所有对window.location的分配静态替换为字符串替换吗? 尽管我宁愿避免这样做,因为javascript很时髦,类似的东西也可能有效,所以我必须跟踪所有分配:

window.location.assign

2 个答案:

答案 0 :(得分:1)

一种解决方案是创建您自己的位置更改提供程序,您可以在其中拦截URL并进行相应的更改。然后,您的代码可以始终调用更改提供者,而不是标准的window.location属性。

粗略地说,如果您无法设置位置属性的代码在您的控制范围之内,则无法使用。

如果您无法控制位置设置代码,请查看使用beforeunload事件的Javascript: How to intercept window.location change

答案 1 :(得分:1)

不幸的是,我认为您无法做到这一点。如您所见,location的{​​{1}}属性是不可配置的(至少在Chrome和Firefox中)。如您所知,它非常特殊:如果您尝试对其进行写入(例如,用您自己的自定义对象替换它),而不是以常规方式替换该属性,它将把您给它的内容转换为字符串并尝试导航到那里。因此,您无法用自己的东西替换windowwindow.location不会让您(因为它是不可配置的),并且分配将无法进行。

这使您承担了识别页面上JavaScript代码中对Object.defineProperty的所有写操作的任务,这在通常情况下是不可能的。尽管您可以找到所有window.locationwindow.location引用,并且静态分析会告诉您(缺少locationeval时,new Function和{{1} }变量是全局变量,您需要逐步评估代码以查找问题中提到的东西,甚至是简单的东西:

window

完全改变解决方案的体系结构,您可以在服务器端运行无头浏览器,并将对DOM的更改回显给客户端,拦截所有单击并将它们转发到服务器端代码,以传递给无头浏览器。可能有自己的重大挑战。