Javascript Ajax安全性

Javascript Ajax安全性,javascript,ajax,security,Javascript,Ajax,Security,我们有一个严重依赖Ajax的应用程序。有什么好方法可以确保对服务器端脚本的请求不是来自独立程序,而是来自坐在浏览器上的实际用户,这是一个有趣的问题 那么嵌入到应用程序中的浏览器呢?你介意吗 您可能会想到一种“证明”请求来自浏览器的方法,但它最终将是启发式的。浏览器和应用程序之间的界限很模糊(例如嵌入式浏览器),您总是会冒着拒绝来自意外浏览器(或其意外版本)的用户的风险。实际上没有 通过浏览器发送的任何请求都可能被独立程序伪造 最终,这真的很重要吗?如果您担心,那么请确保请求经过身份验证和授权,并

我们有一个严重依赖Ajax的应用程序。有什么好方法可以确保对服务器端脚本的请求不是来自独立程序,而是来自坐在浏览器上的实际用户,这是一个有趣的问题

那么嵌入到应用程序中的浏览器呢?你介意吗


您可能会想到一种“证明”请求来自浏览器的方法,但它最终将是启发式的。浏览器和应用程序之间的界限很模糊(例如嵌入式浏览器),您总是会冒着拒绝来自意外浏览器(或其意外版本)的用户的风险。

实际上没有

通过浏览器发送的任何请求都可能被独立程序伪造


最终,这真的很重要吗?如果您担心,那么请确保请求经过身份验证和授权,并且您的身份验证过程良好(请记住Ajax发送浏览器cookies,这样您的“正常”身份验证就可以正常工作)。当然,请记住,独立程序也可以进行身份验证。

Safari是您的网络浏览器吗?
如果是,那么许多应用程序中的引擎都是相同的,比如说那些使用QtQWebKit库的应用程序。所以我想说,没有办法认出它

用户可以伪造任何他们想要的请求-伪造像UserAgent一样的头

一个问题:你为什么要做你要求的事?如果他们从浏览器或其他任何地方请求,您会有什么不同?
想不出你在这里叫“安全”的原因

如果出于任何原因,您仍然想这样做,请考虑使用嵌入式浏览器制作您自己的应用程序。它可以以某种方式在每个请求中对应用程序进行身份验证,然后您只能向应用程序的浏览器发送有效的响应。
不过,用户仍然可以对应用程序进行反向工程

有什么好方法可以确保对服务器端脚本的请求不是来自独立程序,而是来自坐在浏览器上的实际用户

没有办法。浏览器与独立程序无法区分;浏览器可以自动化


您不能信任客户端的任何输入。如果您出于任何安全目的依赖客户端合作,那么您就注定要失败。

如前所述,这是无法实现的。。。但有一点需要注意,这对于防止针对特定AJAX功能的CSRF攻击非常有用;例如,在AJAX对象的帮助下设置自定义头,并在服务器端验证该头


如果在该头的值中设置了一个随机(一次性使用)令牌,则可以防止自动攻击。

我不确定您担心什么。从我坐的地方,我可以看到你的问题与三件事有关:

首先,您可能希望防止未经授权的用户发出有效的请求。这是通过使用浏览器的cookie存储会话ID来解决的。会话ID需要绑定到用户,在用户每次登录过程中重新生成,并且必须具有非活动超时。任何没有有效会话ID的请求都将被拒绝

第二,您可能希望防止第三方对您的站点进行重播攻击(即嗅探inocent用户的流量,然后发送相同的呼叫)。简单的解决方案是通过https实现。SSL层将阻止某人重播任何部分的流量。这在服务器端是要付出代价的,因此您需要确保您确实不能承担这种风险


第三,您可能希望阻止某人使用您的API(这就是最终的AJAX调用)将自己的客户端实现到您的站点。对于这一点,你几乎无能为力。您可以随时寻找合适的用户代理,但这很容易伪造,可能是试图使用您的API的人首先想到的。您总是可以实现一些统计信息,例如,查看每个用户每分钟的平均AJAX请求,看看是否有用户远远高于您的平均值。它很难实现,而且只有当您试图阻止自动客户端的反应速度比人类更快时,它才有用。

没有一种方法可以自动阻止“非浏览器用户”请求命中服务器端脚本,但是有一些方法可以识别哪些脚本是由您的应用程序触发的,哪些没有

这通常是用一种叫做“面包屑”的东西来完成的。其基本思想是,发出AJAX请求的页面应该生成(服务器端)一个唯一的令牌(通常是unix时间戳+salt+机密的散列)。这个令牌和时间戳应该作为参数传递给AJAX请求。AJAX处理程序脚本将首先检查该令牌(以及unix时间戳的有效性,例如,它是否在令牌时间戳的5分钟内)。如果令牌已签出,则可以继续执行此请求。通常,这种令牌生成+检查可以作为Apache模块进行编码,以便自动触发并与应用程序逻辑分离

欺诈性脚本将无法生成有效的令牌(除非他们了解您的算法),因此您可以安全地忽略它们


请记住,在会话中存储令牌也是另一种方式,但这不会比站点的身份验证系统购买更多的安全性。

您是说您只希望人们通过web浏览器通过您的站点使用这些ajax请求,而不是通过与ajax接口的应用程序使用这些ajax请求吗?是的。这至少能达到一定的安全级别吗?我想不出这会带来什么安全好处。除此之外,无法保证请求来自浏览器@吹镖是对的。