使JavaScript代码难以被黑客攻击/注入/篡改的方法是什么?

7
有没有办法防止别人注入Javascript并操纵变量或访问函数,或者让这个过程变得困难一些?我的一个想法是每次重新加载时随机更改所有变量名,这样恶意软件脚本就需要每次重写。还有其他 less painful 的方法吗?
我知道最终总会有人入侵,但我想知道如何使其难以再现此操作,以便人们不会发布书签或类似物供大家使用。我不在乎专家们能否进入代码,但我希望它比 javascript:d=0; 复杂一些。
如果您知道使Javascript攻击变得更加困难的方法,请写下来。

2
混淆是其中的一部分。 - Artelius
2
难吗?是的。足够难吗?对于真正的安全来说永远不够(但对于游戏或其他简单作弊可能足够了)。 - Bart van Heukelom
1
我想问题是“为什么这很重要?”如果有状态发送到服务器,则依靠JS端的guards是不好的做法,如果没有数据发送,那么谁会失去? - spender
2
@splender - 我曾经在一个网站上工作,那里的广告代码非常糟糕。大部分代码都是由代理机构编写的,他们的程序员很擅长Flash,但是JS编程却不行。很多代码都是从1998年复制粘贴过来的。我们没有注意自己的JS命名空间,每年都会有几次广告覆盖了我们需要的某些内容,导致网站崩溃。正确使用命名空间和私有成员,除非必要,否则大多数问题都可以解决。所以他们可以继续做糟糕的事情,而我们可以继续运营网站。 - Andrew
4个回答

23

接受你的JavaScript将被“操纵”,并在服务器端提供相关保护措施。基本上,你无法阻止人们对客户端进行调试。


谢谢,我正在考虑一种使它变得困难的方法,防止操纵并不是绝对必要的,但我希望至少防止有人发布一个书签脚本来‘做那个很酷的事情’,以便每个人都可以黑进去。如果专家最终找到了一种方法,我并不是很在意,但我希望对于新手来说难度足够大,并且如果可能的话,再现操作也很难不使用工具。 - stagas
3
我同意@spender的观点。你方案中的问题在于,最好的情况只能做到“安全性靠隐蔽性保障”。这会耗费你大量的时间和精力,并且永远不可能完全解决问题,因此你仍然需要在服务器端进行处理。 - flpmor
我再怎么强调也不为过。通过模糊性来保证安全是一个坏主意。你需要进行服务器端验证。就这样。 - g.d.d.c

12

您可以编写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);
}());
[编辑] 上面的代码容易受到用户覆盖任何全局可用的对象、方法、事件或属性的影响(在这种情况下,documentgetElementsByTagNameaddEventListener),因此,如果您确实很谨慎,可以在页面加载之前将它们复制到函数作用域中,这样用户就无法覆盖它们。使用addEventListener是一个好主意,因为它不像事件body.onclick那样可以从函数外部被删除或覆盖。

2
你在最后一行有一个错误,应该是 })();。我认为。 - stagas
@Andrew:嗯,你能解释一下 }())})() 的区别吗?我知道自执行函数,但我不明白你刚才做了什么。 - stagas
1
老实说,我不知道这有什么区别,除了Douglas Crockford说调用需要完全在内部。认识他的人都知道,他有非常好的、非常深奥的理由。我只知道这一点,因为我的JSLint验证器在我将调用括号化到外面时会出现两个警告。这些警告是:“将调用移动到包含函数的括号中。”和“用括号包裹整个立即函数调用。”嗯,我厌倦了JSLint伤害我的感情,所以现在我按照它的要求做。我们都更开心了。 - Andrew
+1 是因为你是唯一一个实际回答了 stagas 的问题的人。 - Steve Elmer
4
为了增加一层安全保障,可以将文档(document)、窗口(window)、页面主体(body)以及未定义(undefined)的变量传递给你的JavaScript代码,这样它们就成为该函数的局部变量。示例代码:(function(document, window, undefined){ [...]})(document,window); - Aaron Butacov
显示剩余3条评论

0

任何真正想篡改客户端的用户都能够这么做。代码在他的机器上。即使你混淆了客户端代码,也有工具可以帮助某人在一秒钟内反混淆出代码。

然而,你需要考虑的是使网站在服务器上安全,并对其他用户也同样安全。 这至少意味着:

  1. 在服务器上检查/验证每个请求和输入参数,以便用户无法通过触发您编写的“被黑客攻击”的客户端函数来更改任何服务器端数据。

  2. 检查所有从用户输入源生成的输出到屏幕的数据。其他用户可能已经插入了危险的客户端脚本,这些脚本对您的网站尤其危险,对您网站上的其他用户尤其危险。(如果您使用 .net,则可以查看 AntiXSS 库)


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接