在想跨域 API 方面的问题, 比如 HTML 以静态文件方式存储, 仅仅通过 API 和服务器交换数据.
如果还是放在另一个域名上, 那么本地就可以通过绑定 /etc/hosts
来跑本地代码..
进一步, 就算不是跨域, 本地直接从调试工具大范围修改 JS, 只要知道 API, 也容易跑的.. 而且比如循环插入大量数据这种事情... 算不算个漏洞?
在想跨域 API 方面的问题, 比如 HTML 以静态文件方式存储, 仅仅通过 API 和服务器交换数据.
如果还是放在另一个域名上, 那么本地就可以通过绑定 /etc/hosts
来跑本地代码..
进一步, 就算不是跨域, 本地直接从调试工具大范围修改 JS, 只要知道 API, 也容易跑的.. 而且比如循环插入大量数据这种事情... 算不算个漏洞?
可以参考discuz的表单里,有个串是用来防止重复提交的。比如你在服务器端生成一个时间相关的串,比如这样 以php为例:
$time = time();
$code = $time . '_' . md5( $time . 'yourSalt');
这个code返给表单,ajax提交是一起提交上来,第一步就检查这个code是否合法,不合法自然抛弃这个请求。 收到请求时:
$code = $_GET['code'];
list($time, $encode) = explode('_', $code);
if($encode != md5( $time . 'yourSalt' ))
{
echo '非法请求';
exit();
}
@掳人贾 这个用的是签名原理,问题是这个方案中没有办法对使用次数限制,您贴的代码里面也没有对时间的有效期进行限制,也就是说这个串是万能的,那我可以每次请求都加上这个好了。。
之前见过另外一种类似的方式:生成一个随机字符(比如:uuid),同时把它存储在session中,在使用一次后从session中销毁。这种方案还是没多大用,因为对方完全可以写个脚本先拿到这个数字然后再发送请求,无非是多了一个步骤而已。
lz说的这种程序属于机器人程序,广泛用于刷广告灌水以及针对投票类程序写的刷票机,写这种程序完全可以跳出浏览器,ajax限制太多,java/c#/nodejs什么的几乎所有语言、平台都有这种api可以用于模拟一个请求达到这个目的,因为就一个http请求而已,所以跨域什么的客户端防御完全无效,抓些肉鸡写个分布式程序跑也毫无压力。
如果要防范只能从服务端入手,针对其特征进行识别并屏蔽。 一般的策略是限制每ip地址在一段时间内的请求次数,设定一个阀值,超出后要么上验证码,要么直接拒绝请求。
之前在sf看到有介绍说nginx iptables来实现的,具体什么记不清了,lz可以搜下这些个关键词,大概原理就是根据访问日志统计出访问频繁的IP地址,把这个IP加入黑名单一段时间。其他平台如windows+iis的也可以参考原理自己写或者找找看……
微博和qq空间貌似也是有这种拦截的,但是拦截后并不是直接拒了,而是让你输验证码,输对了才行,体验上会相对好点。
另外提醒lz不要把搜索引擎的蜘蛛给误杀了。。。。
over
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.3k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
5 回答3.8k 阅读
楼主所说的其实是个伪命题。
浏览器的请求操作都可以通过程序后台来模拟,而且也没有浏览器的安全限制。所以相对浏览器,楼主更加应该担忧这个。
之所以说是个伪命题就是:如果真的要单机DOS,靠浏览器是不靠谱的。ajax请求多了在服务器还没挂之前,浏览器自己已经扛不住了(CPU、内存等)。
楼主不妨自己动手试试,让浏览器在20秒内完成10万个请求,并保证每个请求正确处理。