使用jQuery Ajax的安全风险

时间:2012-04-26 12:28:03

标签: jquery ajax security

这个问题困扰了我一段时间,所以我正在寻找意见和解决方案,以打击应用程序存在安全风险的可能性。

我使用jQuery做很多事情,但主要是我用它来处理jQuery对话框窗口。很多时候需要从表单上的字段中获取值,使用.serialize()命令连接该信息并将其传递给jQuery ajax调用以转移到PHP文件以进行数据库交互。

这是我的问题(最后),

是不是很容易“猜测”PHP处理的网址是什么样的?
您可以在现代浏览器中打开源,然后单击链接以查看包含ajax调用的完整JavaScript文件。

我可能会将JavaScript文件缩小为混淆,但这并不是一种可靠的安全形式。

我正在使用PDP进行数据库访问,并准备了SQL注入攻击语句,但如果有人花时间查看,他们是否只能形成一个有效的URL将其发送到数据库并插入他们想要的内容? / p>

我不是在谈论将数据库黑客攻击钢铁信息,我更多的是谈论插入恶意信息,就好像数据是从应用程序本身添加的一样。想想在购物车中添加50美元只需25美元即可。

是否就像将ajax请求从GET转为POST并更改我的PHP文件一样简单?

编辑:此人已登录并经过适当的身份验证。

只是想知道其他人在做什么。

谢谢!

6 个答案:

答案 0 :(得分:12)

你是完全正确的,任何精通技术的人都可以识别任何webapp的公共服务器端点。他们甚至不需要查看代码。他们可以使用他们的webkit / firebug来跟踪请求,或者像Charles这样监控网络活动的程序。

这就是您在服务器端代码中需要身份验证授权处理的原因。

身份验证通常由用户名和密码处理;这是验证用户是谁的行为。

授权可由服务器上的角色处理,并且检查以确保用户可以执行他们正在尝试执行的操作。

这两种机制到位,即使用户知道网址,他们仍然需要"登录"并且有权做他们想做的事。

想一想。如果您在线查看自己的银行帐户信息,则可以轻松识别加载帐户信息的请求。如果没有这些机制,什么是阻止您简单地更改传递给服务器的帐户ID以尝试获取其他人的帐户信息?通过身份验证/授权,服务器知道即使它收到加载某些数据的请求,它也可以检查用户的详细信息,以查看他们是否有权获取该数据,并拒绝该请求。

答案 1 :(得分:8)

即使您从GET切换到POST,对于任何有兴趣查看(和更改)传递给您的服务器的参数的人来说仍然很容易。但这里是踢球者:即使你根本没有使用AJAX,也只是简单的旧表格,仍然非常容易看到和编辑传递给你服务器的任何参数。

在危急情况下,您永远不能完全依赖您从客户那里收到的东西。

例如,如果您要向购物车添加内容,请仅将商品ID和数量传递给您的服务器。不要从您的客户端获取价格详细信息,而是从您的数据库中获取。如果有人试图破解你并编辑物品ID或发送的数量,那么最糟糕的事情就是他们最终会购买他们不想要的东西;完全是他们的问题(但出于同样的原因,如果这是有限的报价,您需要验证您收到的数量不会超过您允许任何一个客户购买的数量。)

因此,在一天结束时,开发人员始终必须决定您希望用户控制哪些值,并在服务器端验证您尚未接收任何超出范围的请求用户应该能够做到。

答案 2 :(得分:2)

您永远不能依赖来自客户端的任何操作或数据,而不仅仅是与jQuery相关。

您必须处理服务器端的各种安全问题。始终仔细检查来自用户的数据(一个在客户端,以减少性能请求的数量;另一个在服务器端进行实际确认)。

请求类型(GET或POST)实际上无关紧要,可以轻松模拟。用户尝试以25美元的价格添加50美元的商品后,您应检查数据库并确认商品的实际价格。

答案 3 :(得分:1)

你不应该这样写代码,价格是从客户单独转移的,因为任何人都可以发送价格= 0或0.01的数据,任何数量的商品/服务或其他任何数据。

更一般:永远不要信任客户数据。

答案 4 :(得分:1)

是的,您需要服务器端安全性来验证每个数据是否都发送到您的服务器。例如,您在javascript / jquery中验证数据:

if($(this).val() != ""){
   // post to my server page (mypage.cfm/php/asp)
}

但是如果你没有保护你的服务器页面,我可以很容易地将空数据发布到你的服务器并避免使用javascript, 所以你需要使用另一个验证脚本来保护服务器页面,例如:

<cfif val is "">
  //dont post to my server ...
</cfif>
有时这是双重工作,但有时候我们都会面对......

答案 5 :(得分:1)

数据库的风险通常是:恶意数据,SQL注入,CSRF。

缩小/缩小您的JavaScript会有所帮助。但是,无论您做什么,您的用户都可以轻松捕获自己的请求数据。而且,没有确定的方法可以防止用户浏览混乱的代码。

仅当用户知道您的所有源代码和配置后仍无法对您进行黑客攻击时,安全性才成立。

没有简单的安全解决方案。以下是一些在大多数情况下可以避免出现问题的常规做法:

使用HTTPS和POST请求。 通过HTTPS上的POST请求,请求数据被加密。该URL是公开的,但是多数民众赞成在正常范围内。这样可以防止人为攻击,并极大地减少了隐私问题(例如密码/信用泄露)。 如果使用GET请求,则所有数据都将作为查询字符串传递到URL中。这意味着有很好的机会为第三方更改您的数据。

服务器端验证 始终在服务器端验证数据。用户可能是恶意的,并且客户端可能存在错误。例如,计算服务器端而非客户端的总价。否则,用户可能会在此处输入0。

访问权限控制AKA授权 对允许的操作设置限制,并限制其有效范围。例如,不允许用户代表他人下订单。并且不要让他们删除其动作历史记录。

生成令牌以防止CSRF 一些库可以防止CSRF。或者您可以实现自己的。主要概念是生成随机令牌并请求客户端将其传递回去。这样可以防止其他网站(使用您的客户端凭据)触发对服务器的请求

正确备份和登录 定期备份数据库将有助于从灾难中恢复(是的,它们将会发生),并通过日志记录模块跟踪用户所做的事情。