Heim  >  Artikel  >  Backend-Entwicklung  >  $_POST安全, 如何避免跨域提交?

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

WBOY
WBOYOriginal
2016-06-23 14:23:521504Durchsuche

我有一些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'])){}


这个行吗?

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn