代码之家  ›  专栏  ›  技术社区  ›  Addsy

避免“数据抓取”网站数据库的主要技术

  •  23
  • Addsy  · 技术社区  · 16 年前

    我正在使用php和mysql建立一个站点,它本质上只是一个现有数据库的Web前端。可以理解的是,我的客户非常希望阻止任何人复制数据库中的数据,但同时希望所有内容都公开,甚至一个“查看全部”链接来显示数据库中的每个记录。

    虽然我已经准备好了一切来防止诸如SQL注入攻击之类的攻击,但是没有什么可以阻止任何人以HTML形式查看所有记录,并运行某种脚本将这些数据解析回另一个数据库。即使我要删除“查看全部”链接,理论上,仍有人可以使用一个自动化的过程逐个检查每个记录,并将其编译到一个新的数据库中,从本质上讲,这会压缩所有信息。

    是否有人有任何好的策略来防止或甚至只是阻止他们可以分享的这一点。

    14 回复  |  直到 10 年前
        1
  •  29
  •   Welbog    16 年前

    如果数据已发布,则互联网上的每个人都可以看到和访问它。这包括你想看的人和你不想看的人。

    你不能两者兼得。您可以这样做,以便数据只能在帐户中可见,并且人们会通过帐户来窃取数据。您可以这样做,以便数据只能从已批准的IP地址中可见,并且人们将通过步骤获得批准,然后再将其删除。

    是的,你可以让它很难得到,但是如果你想让它对典型的用户方便,你也需要让它对恶意的用户方便。

        2
  •  45
  •   Community Mohan Dere    9 年前

    虽然没有什么可以阻止一个有决心的人去搜集公开可用的内容,但是您可以做一些基本的事情来减轻客户的顾虑:

    • 用户帐户、IP地址、用户代理等的速率限制…-这意味着您可以限制特定用户组在特定时间段内可以下载的数据量。如果检测到大量数据正在传输,则关闭帐户或IP地址。

    • 需要javascript-以确保客户端与交互式浏览器有一些相似之处,而不是一个准系统蜘蛛…

    • RIA-通过丰富的Internet应用程序界面提供数据。基于javascript的网格包括extjs、yui、dojo等。更丰富的环境包括flash和silverlight as 1kevgriff mentions .

    • 将数据编码为图像。这对普通用户来说相当干扰,但是您可以将一些数据表或值编码为图像而不是文本,这将击败大多数文本解析器,但当然不是万无一失的。

    • robots.txt-否认明显的网络蜘蛛,已知的机器人用户代理。

      用户代理:*

      不允许:

    • 使用机器人元标签。这将阻止符合标准的蜘蛛。这将阻止谷歌为您编制索引,例如:

      <meta name=“robots”content=“noindex,follow,noarchive”>

    威慑程度不同,第一种选择可能是最不具侵入性的。

        3
  •  11
  •   Brent Baisley    16 年前

    虽然没有一种方法是理想的,但你能做到的方法很少。

    1. 将数据显示为图像而不是HTML。这需要在服务器端进行额外的处理,但使用PHP中的图形库并不困难。或者,您可以只针对特定大小的请求(即全部请求)执行此操作。

    2. 加载一个页面shell,然后通过Ajax调用检索数据并将其插入到DOM中。使用会话设置一个哈希,该哈希必须通过Ajax调用作为验证返回。哈希只能在特定的时间长度(即10秒)内有效。这实际上只是增加了一个额外的步骤,一些人需要跳过这个步骤来获取数据,但是会阻止简单的页面抓取。

        4
  •  7
  •   Kevin Griffin    16 年前

    尝试在前端使用flash或silverlight。

    虽然这不能阻止一个人,如果他们真的下定决心,这将是更困难的。如果您通过服务加载数据,则可以始终使用安全连接来防止中间人抓取。

        5
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    你真的无能为力。你可以尝试寻找一个通过你的网站的自动化过程,但最终他们会赢。

    经验法则:如果你想保留一些东西给自己,就不要让它上网。

        6
  •  5
  •   reefine    16 年前

    为每个唯一的IP每10页加载一次recaptcha

        7
  •  3
  •   Even Mien    16 年前

    把你的手从键盘上拿开,问你的客户原因。 为什么 他希望数据是可见的,但不能被擦除?

    他要求两件不一致的事情,也许就他的推理进行讨论会产生一些成果。

    可能他真的不希望它公开访问,您需要添加身份验证/授权。或者,他可能会认为实际打开一个API是有价值的。但除非你问,否则你不会知道。

        8
  •  2
  •   S.Lott    16 年前

    我不知道你为什么要阻止这件事。客户提供数据。

    假设它们以某种独特的方式创造价值,而不是以琐碎的方式反映在数据中。

    不管怎样。

    你可以检查浏览器,屏幕分辨率和IP地址,看看它是否有可能是某种自动刮刀。

    大多数东西,比如curl和wget——除非经过仔细配置——显然不是浏览器。

        9
  •  2
  •   Dean J    16 年前

    使用类似于AdobeFlex(一个Flash应用程序前端)的工具可以解决这个问题。

    除此之外,如果你想让用户更容易访问,用户也很容易复制。

        10
  •  1
  •   Andy E    16 年前

    对此没有简单的解决方案。如果数据是公开的,那么它就可以被抓取。唯一能做的就是通过添加/更改HTML而不影响布局,使每个条目稍微独特,从而使scraper的生活更加困难。这可能会使使用正则表达式获取数据变得更加困难,但这仍然不是一个真正的解决方案,我想说,任何有足够决心的人都会找到解决方法。

    我建议你告诉你的客户这是一项无法完成的任务,继续你工作的重要部分。

        11
  •  0
  •   Shawn Leslie    16 年前

    创造类似于布告栏的巨魔保护的东西怎么样?如果检测到一个抓取(可能是每分钟从一个IP进行一定数量的访问,或者是一个看起来像站点地图抓取的定向抓取),那么您就可以开始显示垃圾数据,比如更改电话号码的几个数字,或者在名称字段中添加一些愚蠢的名称。

    为Google IP关闭此功能!

        12
  •  0
  •   Community Mohan Dere    9 年前

    通常情况下,为了筛选出一个合适的数量,你必须向你的服务器发出成百上千(甚至更多)的请求。我建议您阅读相关的堆栈溢出问题:

    How do you stop scripters from slamming your website hundreds of times a second?

        13
  •  0
  •   Matthew Lock fge    14 年前

    使用这样一个事实:scraper倾向于快速连续加载多个页面来检测scraper行为。每N页加载x秒显示一个验证码,并且/或者包括每一页加载的指数增长延迟,当每分钟加载数十页时,延迟会变得相当长。

    这样,普通用户可能永远看不到您的验证码,但抓取程序将很快达到限制,迫使他们解决验证码。

        14
  •  -3
  •   Chuck Vose    16 年前

    我的建议是,这无论如何都是非法的,所以如果有人盗取了网站,至少你有法律上的追索权。因此,最好的做法可能只是包含一个链接到原始网站,让人们刮掉。他们刮得越多,你的链接就会越多地出现在互联网周围,越来越多地建立你的网页排名。

    刮伤的人通常并不反对包含到原始网站的链接,因为它建立了一种与原始作者的融洽关系。

    所以我的建议是问你的老板这是否真的是对网站健康最好的事情。