我有一些AJAX页面,提交并链接数据库,最近怀疑有人用fsockopen或者curl模拟POST表单,偷取我的数据库资料。如何避免$_POST跨域提交?可否在apache里设置?或者用$_SERVER之类的进行判别?

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

    除了不友好的验证码之外,没有别的方法
    不过简单些的验证码也是可以机器识别的你是些AJAX页面,所以验证码也是不能用的
    可以考虑请求数据部分的 js 代码也是动态产生的
    这样窃取者如不能动态解析 js 就无法获取数据了
      

  6.   


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

  7.   

    作为一个长期数据搜集者,很遗憾地告诉你,上面说的方法都能应付但作为php学得比你早,还知道点市场运作知识的人,我给你的建议有下面这些(基于开放数据内容):
    1.最重要的一点:你要搞清防范的对象,像我这样的人(看最后),你防也没用,也没必要,关键是防你公司的竞争对手
    2.基于第1点,也没必要做全数据库防范,那是防黑客层面的工作,只需要在关键数据上面做手脚就行了
    什么是关键数据?对商城来说,价格就是关键数据,淘宝为何不防范?因为不是淘宝自己在卖东西……完毕
    3.任何的防范工作必然会导致用户体验降低,流失客户的损失和防范少数小偷的得益之间的比较,需要衡量
    4.真的要防范的话——
    1) 防机器不防人,区别是什么?前者读代码,后者读文字(肉眼),所以从这点出发最重要
    2) 基于上面第2点,最好和市场部协同,找对重要数据
    3) 抓数据有三个步骤:开发爬虫、抓取过程、重组数据,针对增加开发难度,没必要,也没办法;针对抓取增加难度,这个上述第3点说了,慎重对待,最好针对“时间”做文章;最好把着眼点放在重组数据的难度,就是说抓到了也很难用程序重组,这个就要看你的能力了
    4) 大公司应该从公司层面做对付小偷的工作,例如诉讼,这样更显得公司的大气形象;小公司一般服务对象比较固定,采用“信任”机制会更好,例如一些数据只对特定人员开放
    ……
    总的来说应该结合商业模型,不要技术部全扛下来补充3)所说的举例方案:
    A: 如唠叨所说,某些东西用js“拼”出来,直接写出来不行,那还是完整结果;这是因为现在懂调用js引擎运算结果的人还很少
    B: 以前帮别人做过这样的事——四位数,用N(某数量< N >4,随机)张图片显示,从代码看这N张图片代码完全一致,取回的字节数也接近,但目视只有4张显示出所需要的数字(结合网页底色),当时这个方法使用相当一段时间都有效,但随着OCR的程序越来越简单,这个方法也失效了,但原理还是有用的我抓数据漫无目的(指target),只抓自己有用和喜欢的东西,例如中日韩的邮政编码 、喜欢的图片……,不卖钱不外传也从不帮别人抓,商业数据一点兴趣(用处)也没有,可能去抓还惹来一身骚,后果严重,俺要为人生倒数的几年着想啊最后告诉你,我现在还没法对付的就是——图片瀑布墙 
      

  8.   

    本来想考虑token,hash或者全局变量的,不过听了LS那位大哥的话,心凉了一大截。弱弱的问一句,“图片瀑布墙”是什么?
      

  9.   

    全局变量怎么设置,有示例吗?另外像firebug之类的可以看到吗?post,get,cookie都看的到……
      

  10.   

    http://qing.weibo.com/tag/%E6%97%85%E8%A1%8C这个就是图片瀑布墙
      

  11.   

    补充一下
    无论你是用 cookie、session还是token都不能达到防范的作用
    因为检查的是客户端回传的数据与服务端预设的是否一致那么好了,我只要将采集的动作分为两步:
    1、进入你的ajax页面,你的网站就会把验证的相关数据发给我。因为你的ajax提交也是要验证的
    2、向目标页发送请求,此时与你的ajax请求是一样携带验证数据的
      

  12.   


    这些我都知道。我老做这种事了,所有报应来了……言归正传,我知道cookie、session,token都弱的不行,如果是我,我也会分2步走,先采集主页面上的AJAX超链,再模拟POST采集AJAX页面的内容。所以,有没有什么APACHE,PHP的全局变量设置,限制某些页面只允许服务器IP地址,或者URL才能访问?
      

  13.   

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

  14.   

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

  15.   


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

  16.   


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

  17.   

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

  18.   

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

  19.   


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

  20.   

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

  21.   


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

  22.   

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

  23.   

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

  24.   


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

  25.   

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

  26.   

    if(preg_match('#domain\.com#i',$_SERVER['HTTP_REFERER'])){}这个行吗?