Javascript 调用重写和冻结的函数

Javascript 调用重写和冻结的函数,javascript,Javascript,我正在构建一个安全框架,该框架将注入一个javascript文件,该文件将始终首先执行,并阻止一些要执行的函数。 开发者将制作自己的webapp,脚本将确保某些功能不能被调用 假设“阻塞”脚本如下所示: window.alert = function(){Object.freeze(this)} 应用程序是否有办法绕过此块,而不使用iframe/外部文件? 删除(window.alert)在这种情况下不起作用。如果不能先停止该脚本的运行,则不起作用,否则可以将原始的警报附加到其他内容: var

我正在构建一个安全框架,该框架将注入一个javascript文件,该文件将始终首先执行,并阻止一些要执行的函数。 开发者将制作自己的webapp,脚本将确保某些功能不能被调用

假设“阻塞”脚本如下所示:

window.alert = function(){Object.freeze(this)}
应用程序是否有办法绕过此块,而不使用iframe/外部文件?
删除(window.alert)在这种情况下不起作用。

如果不能先停止该脚本的运行,则不起作用,否则可以将原始的
警报
附加到其他内容:

var oldAlert = window.alert;
window.alert = function(){Object.freeze(this)}
您如何/为什么使用
警报
?如果是为了调试,最好使用
console.log
。如果您使用它来通知用户,那么可能一个专用模式将是更好的选择

根据您更新的问题,这取决于框架的加载方式


假设您将脚本提供给开发人员使用,在这种情况下,他们可以很容易地更改脚本的功能。如果代码在不是您的环境中运行,那么您可以假定它不安全。浏览器插件可以阻止脚本,这会绕过javascript文件中的任何安全性。

您需要在
窗口上设置
警报
属性。prototype
,而不是
窗口上设置。否则:

Window.prototype.alert.call(window, 'This works.');

基于@Abdennour TOUMI在这篇帖子上的工作:,你可以做类似的事情:

window.alert = function(){Object.freeze(this)} ;

Object.unfreezeAlert=function(){
       return window.prompt;
 }

window.alert = Object.unfreezeAlert(window.alert);
alert ('test4');  

您已经覆盖了alert方法,因此无法再获取原始警报。调用
alert()
时,首先执行
对象。free
然后执行原始JS
alert
函数,对吗?您可以编写一个新的窗口警报方法,并将其输出到控制台或显示在页面上可见的HTML元素中。如果您只需要
alert()
来烦扰用户,您也可以使用
prompt()
(如果未被覆盖)alert()这只是一个更一般概念@majaFollow up问题的示例:如果在HEAD的开头覆盖警报,是否有任何方法在它之前执行代码(假设HEAD中的第一个脚本始终是阻止警报的脚本)?也许是我忽略了的一些事件,比如加载()谢谢!javascript是按顺序执行的,只需按照您希望它运行的顺序编写它,但关键是我不能更改顺序,脚本始终是第一位的。在这种情况下,我什么也做不了?你能完整地解释一下你遇到的问题吗,因为覆盖警报听起来只是一个基本的例子。为什么不能更改订单?它们是自动生成的吗?是cms吗?信息越多,回答越好谢谢,这实际上让警报出现了!我不知道你为什么会被否决。@Thom Smith真的很抱歉被否决(在打电话时玩我的鼠标…),我再次使用你的代码更新我的小提琴。显然我可以在24小时内撤销投票,除非你修改你的答案。。。再次抱歉,我注意到我在小提琴中通知的一个奇怪行为是的,而且你正在用提示替换警报,因此警报实际上仍然被阻止。不,这不是问题所在。看到小提琴,警报当前被重新激活(感谢@Thom Smith),但检查其中的注释,会出现意外行为:如果您在尝试解冻之前调用警报,它将无法工作。如果你对此有任何解释,我很感兴趣。无论如何,我认为兴趣主要是重新影响警报方法,而不是重新激活它。