【问题标题】:Security of ajax vs regular form dataajax 与常规表单数据的安全性
【发布时间】:2013-07-22 19:38:11
【问题描述】:
只是想知道安全性的区别
<input type="hidden" name="id" value="<?php echo $id; ?>">
对比
jQuery(this).ajaxSubmit({
data: { id: '<?php echo $id; ?> }
});
发送表单数据时。一种方法比另一种更容易受到黑客攻击吗?安全发送表单数据以使外人无法篡改或更改 ID 号的最佳方法是什么?
【问题讨论】:
标签:
javascript
ajax
forms
【解决方案1】:
安全性没有区别。在这两种情况下,都会向服务器发送 HTTP POST 请求并从服务器接收响应。除了请求中的一些标头之外,服务器甚至并不真正知道或关心两者之间的区别。
为了说明这一点,请在提交常规表单 POST 和 AJAX POST 时查看浏览器调试工具(Firebug 或 Chrome 工具)中的网络请求。两者非常接近相同,除了浏览器可能会为 AJAX 添加另一个或两个标题。
安全发送表单数据以使外人无法篡改或更改 ID 号的最佳方法是什么?
没有。任何精明的用户都可以手动制作 HTTP POST 请求以包含他们想要的任何数据。现在的浏览器甚至有方便的工具来帮助开发和调试目的。一般规则是服务器端代码从不隐式信任从客户端发送的请求。始终验证用户是否有权执行他们正在尝试执行的操作、数据不是恶意的或在使用前经过适当清理(尤其是在数据库查询中作为常见示例)等等。
【解决方案2】:
从安全的角度来看,基本上没有区别。在这两种情况下,某人看到 id 都是微不足道的,而在这两种情况下,某人构造自己的 API 请求也是微不足道的。
确保表单安全的方法是确保始终在服务器上验证所有内容。虽然在客户端添加诸如表单验证之类的东西可以带来更好的用户体验,但这并不安全。您应该始终假设您的服务器可以在请求中接收无效和恶意数据并将其考虑在内。
【解决方案3】:
Form 与 AJAX 没有区别。不同之处在于您使用的是 GET 还是 POST,以及您使用的是 HTTPS 还是 HTTP。
如果您不希望您的数据被篡改,您应该使用 HTTPS 和 POST 而不是 GET 或未加密的 HTTP POST。有关 GET 与 POST 的比较,请参阅 this。 Get 将创建一个查询字符串,它是 URL 的一部分,其中包含数据,即使您使用 HTTPS,嗅探器也可以看到该 URL。
如果您使用 POST,则发布的消息包含您的数据,因此嗅探只会看到 URL,这不会显示 ID,但他们将无法看到发布到服务器的 ID,因此他们可以'脾气暴躁。