Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Javascript代码黑客攻击/注入/操作变得困难?_Javascript_Security_Browser_Code Injection_Malware - Fatal编程技术网

如何使Javascript代码黑客攻击/注入/操作变得困难?

如何使Javascript代码黑客攻击/注入/操作变得困难?,javascript,security,browser,code-injection,malware,Javascript,Security,Browser,Code Injection,Malware,有没有办法阻止或使某人很难注入Javascript并操纵变量或访问函数?我的一个想法是在每次重新加载时随机更改所有var名称,以便每次都需要重写恶意软件脚本?还是有其他不那么痛苦的方式 我知道最终会有人入侵,但我想知道如何使复制动作变得困难,这样人们就不会发布书签或类似的东西供大家使用。我不在乎专家是否能在代码中找到自己的方法,但我希望它比javascript:d=0 如果你知道如何让破解Javascript变得更加困难,请写下来。接受你的Javascript将被“操纵”,并在服务器端做好准备。

有没有办法阻止或使某人很难注入Javascript并操纵变量或访问函数?我的一个想法是在每次重新加载时随机更改所有var名称,以便每次都需要重写恶意软件脚本?还是有其他不那么痛苦的方式

我知道最终会有人入侵,但我想知道如何使复制动作变得困难,这样人们就不会发布书签或类似的东西供大家使用。我不在乎专家是否能在代码中找到自己的方法,但我希望它比
javascript:d=0


如果你知道如何让破解Javascript变得更加困难,请写下来。

接受你的Javascript将被“操纵”,并在服务器端做好准备。从根本上说,您无法阻止人们修补客户端。

您可以编写JS,在自执行函数中仅使用私有方法和变量。例如,下面的代码在全局名称空间中没有留下任何自己的标志供任何人使用

(function(){
    var x = 1;
    var y = 2;
    var z = "A am z";
    var clickHandler = function() {
        alert('You clicked the body');
    };
    document.getElementsByTagName('body')[0].addEventListener('click',clickHandler,true);
}());

[编辑]
上述代码容易被用户覆盖您正在使用的任何全局可用对象、方法、事件或属性(在本例中,
document
getElementsByTagName
addEventListener
),因此,如果你真的有妄想症,你可以在页面加载之前将它们复制到你的函数范围,用户有机会覆盖它们。使用
addEventListener
是一个好主意,因为与事件
body.onclick
不同,它不能从函数外部删除或覆盖

混淆和缩小应该会使黑客攻击变得更加困难,但我同意spender的观点。

任何真正想篡改客户端的用户都可以。密码在他的机器上。即使您混淆了客户端代码,也有一些工具可以帮助用户在一秒钟内恢复代码

不过,您需要考虑的是使站点在服务器上安全,对其他用户也安全。 这意味着(至少):

  • 检查/验证服务器上的每个请求和输入参数,这样用户就不能通过触发您编写的“黑客”客户端函数来更改任何服务器端数据

  • 检查您输出到屏幕的来自用户输入的所有数据。其他用户可能插入了对您的站点非常危险的客户端脚本,尤其对您站点上的其他用户非常危险。(如果您使用的是.net,请查看AntiXSS库)


  • 混淆是其中的一部分。难吗?对够难吗?从来都不是为了真正的安全(但这可能足以阻止游戏中的作弊行为)。我想问题是“为什么这很重要?”如果有状态发送到服务器,依赖JS端的守卫是不好的做法,如果没有数据发送,那么谁输了?@splender-我曾经在一个拥有最糟糕广告代码的网站上工作。其中大部分都是由一些机构编写的,这些机构的程序员非常了解flash,但无法编写JS来拯救他们的生命。其中很多都是从1998年起被删掉的。我们对自己的JS名称空间不小心,一年中有好几次,广告会覆盖我们需要的内容,网站就会崩溃。适当的名称空间和使用私有成员(除非必要)可以消除这些问题。谢谢,我在想一个办法让它变得困难,防止操纵并不是很重要,但我想至少防止有人发布书签来“做那件很酷的事”,这样每个人都可以黑客。我真的不在乎专家是否最终找到了一种方法,但我希望这对noobs来说足够困难,如果可能的话,如果不使用工具,可能很难再现动作。我同意@spender的观点。您的场景中的问题是,您所能做的最好的事情是通过隐蔽性实现安全性。这将花费您大量的时间和精力,而且永远无法完全解决问题,因此您也必须在服务器端完成这项工作。我完全同意。通过默默无闻实现安全是个坏主意。您需要进行服务器端验证。句号。您在最后一行有一个错误,它应该是
    }()}())
    })(
    的区别吗?
    我知道自动执行函数,但我不明白你刚才做了什么。老实说,我不知道这有什么区别,除了道格拉斯·克罗克福德说调用需要完全在内部。了解他,有一个非常好,非常神秘的原因。我之所以知道这一点,是因为当调用括号在外时,我的JSLint验证器会发出两个警告。警告是:
    将调用移动到包含函数的参数中。
    将整个即时函数调用包装到参数中。
    好吧,我厌倦了JSLint伤害我的感情,所以现在我照它说的做。这样我们都更开心了。一个额外的安全层是将文档、窗口、主体和未定义的变量传递给JS,因此它们是函数的本地变量<代码>(函数(文档,窗口,未定义){[…]})(文档,窗口)