Maison  >  Article  >  développement back-end  >  $_POST安全, 如何避免跨域提交?

$_POST安全, 如何避免跨域提交?

WBOY
WBOYoriginal
2016-06-23 14:23:521505parcourir

我有一些AJAX页面,提交并链接数据库,最近怀疑有人用fsockopen或者curl模拟POST表单,偷取我的数据库资料。

如何避免$_POST跨域提交?

可否在apache里设置?或者用$_SERVER之类的进行判别?


回复讨论(解决方案)

做个session判断 提交者的身份不行吗

1.如果能设定数据的访问权限,比如说只有登录会员才可查看,这样会给别人的抓取造成一定难度。但这个障碍总能被解决的。
2.分析访问日志,从服务器级别限制可疑IP访问。
3.记录每个IP的操作密度,较频繁的可不定时要求输验证码

或请求时设定一变化规则判断参数符合才给数据

一个token 或者一个验证码就解决了...
或者上面说的产生一个 全局变量 验证一下

如版主所说,生成令牌验证再对频繁提交的IP设置验证码即可。

用session生成令牌,提交之后验证session,合法则马上注销这个session,确保每次都有一个新的令牌.

一个token 或者一个验证码就解决了...
或者上面说的产生一个 全局变量 验证一下  全局变量验证能具体点么

除了不友好的验证码之外,没有别的方法
不过简单些的验证码也是可以机器识别的

你是些AJAX页面,所以验证码也是不能用的
可以考虑请求数据部分的 js 代码也是动态产生的
这样窃取者如不能动态解析 js 就无法获取数据了

我有一些AJAX页面,提交并链接数据库,最近怀疑有人用fsockopen或者curl模拟POST表单,偷取我的数据库资料。

如何避免$_POST跨域提交?

可否在apache里设置?或者用$_SERVER之类的进行判别?

使用验证,加hash。这些hash值绑定时间,
(1)设定时间内失效
(2)加密方式根据时间日期变化


除了不友好的验证码之外,没有别的方法
不过简单些的验证码也是可以机器识别的

你是些AJAX页面,所以验证码也是不能用的
可以考虑请求数据部分的 js 代码也是动态产生的
这样窃取者如不能动态解析 js 就无法获取数据了


+1,除非是搜索引擎的机器人才可以解析js。

作为一个长期数据搜集者,很遗憾地告诉你,上面说的方法都能应付

但作为php学得比你早,还知道点市场运作知识的人,我给你的建议有下面这些(基于开放数据内容):
1.最重要的一点:你要搞清防范的对象,像我这样的人(看最后),你防也没用,也没必要,关键是防你公司的竞争对手
2.基于第1点,也没必要做全数据库防范,那是防黑客层面的工作,只需要在关键数据上面做手脚就行了
什么是关键数据?对商城来说,价格就是关键数据,淘宝为何不防范?因为不是淘宝自己在卖东西……完毕
3.任何的防范工作必然会导致用户体验降低,流失客户的损失和防范少数小偷的得益之间的比较,需要衡量
4.真的要防范的话??
1) 防机器不防人,区别是什么?前者读代码,后者读文字(肉眼),所以从这点出发最重要
2) 基于上面第2点,最好和市场部协同,找对重要数据
3) 抓数据有三个步骤:开发爬虫、抓取过程、重组数据,针对增加开发难度,没必要,也没办法;针对抓取增加难度,这个上述第3点说了,慎重对待,最好针对“时间”做文章;最好把着眼点放在重组数据的难度,就是说抓到了也很难用程序重组,这个就要看你的能力了
4) 大公司应该从公司层面做对付小偷的工作,例如诉讼,这样更显得公司的大气形象;小公司一般服务对象比较固定,采用“信任”机制会更好,例如一些数据只对特定人员开放
……
总的来说应该结合商业模型,不要技术部全扛下来

补充3)所说的举例方案:
A: 如唠叨所说,某些东西用js“拼”出来,直接写出来不行,那还是完整结果;这是因为现在懂调用js引擎运算结果的人还很少
B: 以前帮别人做过这样的事??四位数,用N(某数量4,随机)张图片显示,从代码看这N张图片代码完全一致,取回的字节数也接近,但目视只有4张显示出所需要的数字(结合网页底色),当时这个方法使用相当一段时间都有效,但随着OCR的程序越来越简单,这个方法也失效了,但原理还是有用的

我抓数据漫无目的(指target),只抓自己有用和喜欢的东西,例如中日韩的邮政编码  、喜欢的图片……,不卖钱不外传也从不帮别人抓,商业数据一点兴趣(用处)也没有,可能去抓还惹来一身骚,后果严重,俺要为人生倒数的几年着想啊

最后告诉你,我现在还没法对付的就是??图片瀑布墙 

图片瀑布墙
本来想考虑token,hash或者全局变量的,不过听了LS那位大哥的话,心凉了一大截。

弱弱的问一句,“图片瀑布墙”是什么?

一个token 或者一个验证码就解决了...
或者上面说的产生一个 全局变量 验证一下
全局变量怎么设置,有示例吗?另外像firebug之类的可以看到吗?post,get,cookie都看的到……

http://qing.weibo.com/tag/%E6%97%85%E8%A1%8C

这个就是图片瀑布墙

补充一下
无论你是用 cookie、session还是token都不能达到防范的作用
因为检查的是客户端回传的数据与服务端预设的是否一致

那么好了,我只要将采集的动作分为两步:
1、进入你的ajax页面,你的网站就会把验证的相关数据发给我。因为你的ajax提交也是要验证的
2、向目标页发送请求,此时与你的ajax请求是一样携带验证数据的

看了11楼的大牛的话 觉得自己就像一完全的菜鸟 什么都不懂

补充一下
无论你是用 cookie、session还是token都不能达到防范的作用
因为检查的是客户端回传的数据与服务端预设的是否一致

那么好了,我只要将采集的动作分为两步:
1、进入你的ajax页面,你的网站就会把验证的相关数据发给我。因为你的ajax提交也是要验证的
2、向目标页发送请求,此时与你的ajax请求是一样携带验证数据的

这些我都知道。我老做这种事了,所有报应来了……

言归正传,我知道cookie、session,token都弱的不行,如果是我,我也会分2步走,先采集主页面上的AJAX超链,再模拟POST采集AJAX页面的内容。

所以,有没有什么APACHE,PHP的全局变量设置,限制某些页面只允许服务器IP地址,或者URL才能访问?

本帖最后由 PhpNewnew 于 2013-01-10 21:53:39 编辑

引用 15 楼 xuzuning 的回复:补充一下
无论你是用 cookie、session还是token都不能达到防范的作用
因为检查的是客户端回传的数据与服务端预设的是否一致

那么好了,我只要将采集的动作分为两步:
1、进入你的ajax页面,你的网站就会把验证的相关数据发给我。因为你的ajax提交也是要验证的
2、向目标页发送请求,此时与你的ajax请求……

楼上那些都是吓你的,一个验证码 解决,当然你别弄那些 小学3年纪都能看出来的验证码。
看看淘宝 雅虎的验证码是怎么样的,不行来点汉字夹杂。再来点验证次数多少次失败 黑名单
除非你的数据价值连城,若不然 我想没人会去花那么大的精力建库 做这个图像的识别.

最后把你的资料都生成图片输出....好了吧,你采吧...

http://qing.weibo.com/tag/%E6%97%85%E8%A1%8C

这个就是图片瀑布墙 什麽人?起了一?"瀑布"??的名字,??的做法好多年前就在用了,只是那?候?有??名字

补充一下
无论你是用 cookie、session还是token都不能达到防范的作用
因为检查的是客户端回传的数据与服务端预设的是否一致

那么好了,我只要将采集的动作分为两步:
1、进入你的ajax页面,你的网站就会把验证的相关数据发给我。因为你的ajax提交也是要验证的
2、向目标页发送请求,此时与你的ajax请求是一样携带验证数据的

是携带验证数据,只考虑防机器采数据、
请求时加个js参数可以吧。

是啊 搞个密钥

一个时间变量 + 一串密钥 之后对比下 这样安全多了

在牛b点 每次post 都动态处理 验证

http://qing.weibo.com/tag/%E6%97%85%E8%A1%8C

这个就是图片瀑布墙
这个图片瀑布墙 怎么个没法破解? 没发现啊

是携带验证数据,只考虑防机器采数据、
请求时加个js参数可以吧。

有没有简单的实例,教程之类的,怎么写?然后自己再改个复杂点的。

function isAjax() {		return $_SERVER ['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';	}

处理前先判断一下是不是ajax请求,不是则exit();

PHP code?123function isAjax() {        return $_SERVER ['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';    }
处理前先判断一下是不是ajax请求,不是则exit();

补充一下,因为ajax不能跨域。

引用 26 楼 bbjbepzz 的回复:PHP code?123function isAjax() {        return $_SERVER ['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';    }
处理前先判断一下是不是ajax请求,不是则exit();

补充一下,因为ajax不能跨域。


http请求头是可以手动构造的!你这个方法不可行,我刚实测了

http请求头是可以手动构造的!你这个方法不可行,我刚实测了 
这个倒没盗用过,感谢这位朋友的测试。

动态生成session,post时再检查一下。

但是做手机接口的时候就会出有问题了

引用 14 楼 snmr_com 的回复:http://qing.weibo.com/tag/%E6%97%85%E8%A1%8C

这个就是图片瀑布墙
这个图片瀑布墙 怎么个没法破解? 没发现啊

不是没法,是没简单点的方法,现在是手动抓http请求再发过去,但想找些更加自动的方法(适用于不同站点而不仅是weibo)

好复杂的样子,才初学的路过

不是没法,是没简单点的方法,现在是手动抓http请求再发过去,但想找些更加自动的方法(适用于不同站点而不仅是weibo)
……
只要做到不被自动程序抓取就好,只有手动才可以抓取,效果已经达到了。
世上没有解不了的密。

最简单而有有效的方法 判断IP在规定时间的访问次数,如果判断是采集过来的IP,直接给他一些垃圾数据。哈哈 他就悲剧了

作为一个长期数据搜集者,很遗憾地告诉你,上面说的方法都能应付

但作为php学得比你早,还知道点市场运作知识的人,我给你的建议有下面这些(基于开放数据内容):
1.最重要的一点:你要搞清防范的对象,像我这样的人(看最后),你防也没用,也没必要,关键是防你公司的竞争对手
2.基于第1点,也没必要做全数据库防范,那是防黑客层面的工作,只需要在关键数据上面做手脚就行了
……

我最近打算找时间看瀑布墙呢,有想法随时找你交流哈!

最简单而有有效的方法 判断IP在规定时间的访问次数,如果判断是采集过来的IP,直接给他一些垃圾数据。哈哈 他就悲剧了

那要多建立一个IP记录数据库,增加MYSQL负担,总不见得手动查找LOG吧。

如果有人手工跨域提交防不住
因为http无状态,不知道你之前的域,一切可以带过去的信息都是可以手工模拟的,比如HTTP_REFERER。
倒是机器跨域提交,可以带一个token,token这东西本身不是防止跨域提交,而是防止重复提交的,也就是说同一个post不能提交多次,第二次提交的时候必须变换服务器给出的新token(也就是说必须请求一次某个页面拿到新token)。做个图片验证码之类的可以防住一些机器提交,但是手工提交依旧防不住。
如果有人恶意提交数据,搞攻击,还是从服务器上作策略,断了这个ip的tpc链接吧。

汗,不知道PHP6能不能修补掉这个BUG。

汗,不知道PHP6能不能修补掉这个BUG。

这个应该不是bug,而是http的特点。

这个应该不是bug,而是http的特点。

所有技术标准,都是人制定的,一切基础都是0和1,世上没有解决不了的难题。

这个问题只能寄希望于下一版PHP了。

if(preg_match('#domain\.com#i',$_SERVER['HTTP_REFERER'])){}


这个行吗?

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn