防止网站数据库被"数据抓取"的顶级技巧

25

我正在使用PHP和MySQL设置一个网站,基本上只是现有数据库的Web前端。可以理解的是,我的客户非常希望防止任何人能够复制数据库中的数据,但同时希望所有内容都公开可见,甚至包括“查看全部”链接来显示数据库中的每条记录。

虽然我已经采取了措施来防止SQL注入攻击等攻击,但没有防止任何人通过查看所有以HTML格式呈现的记录并运行某种脚本将这些数据解析回另一个数据库。即使我删除“查看全部”链接,某些人仍然可能使用自动化程序按顺序逐个浏览每条记录,并将其编译成新的数据库,从而窃取所有信息。

有没有任何好的策略可以防止或者至少减少这种情况的发生,希望大家分享。


1
你可以从内容中生成图像/PDF。 - Marcel
14个回答

47

虽然决心强的人可以通过抓取公开可用的内容来获取数据,但您可以采取一些基本措施来减轻客户的担忧:

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

  • 要求JavaScript - 确保客户端具有某种交互式浏览器的外观,而不是裸露的蜘蛛...

  • RIA - 通过Rich Internet应用程序接口使您的数据可用。 基于JavaScript的网格包括ExtJs、YUI、Dojo等。 更丰富的环境包括Flash和Silverlight,如1kevgriff提到的

  • 将数据编码为图像。 这对于普通用户非常侵入性,但您可以将一些数据表或值编码为图像而不是文本,这会打败大部分文本解析器,但当然并不是绝对可靠的。

  • robots.txt - 拒绝明显的Web蜘蛛,已知的机器人用户代理。

    User-agent: *

    Disallow: /

  • 使用机器人元标记。 这将阻止符合规范的蜘蛛。 例如,这将防止Google索引您:

    <meta name="robots" content="noindex,follow,noarchive">

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


1
请注意 - 这个答案可能已经过时了; 它在2010年是有效的,但现在几乎所有的爬虫都能使用“无头浏览器”(例如PhantomJS套件),能够执行JavaScript并从由丰富的JavaScript接口呈现的页面中获取结果。此外,如果您想进行任何形式的速率限制,您需要找到一种方法来阻止所有Tor和公共代理服务,这些服务使得任何想要传播爬取数据的人都可以将其分散在许多独特的IP地址上。 - Peteris

32
如果数据被发布,那么它就对所有人可见和可访问。这包括你想要看到的人和你不想看到的人。
你不能两全其美。你可以使数据只能在有账户的情况下才能查看,但人们会创建账户来获取数据。你也可以使数据只能从已批准的IP地址访问,但人们会按照步骤获取批准以获取该数据。
是的,你可以让获取数据变得困难,但如果你希望方便典型用户使用,那么也需要方便恶意用户。

7
是的,这也是我的看法。但显然,客户已经让另一个“专家”查看了该网站,现在让我的客户有些惊慌不安。在我看来,任何试图使其更加困难的尝试都要么容易克服(例如需要登录,在过多或奇怪的HTML标记中隐藏数据),要么会对可访问性/SEO产生严重影响(例如在PHP端混合数据并再次使用JavaScript解开,检查访问者是否使用“适当”的Web浏览器等)。无论如何,感谢大家的帮助。 - Addsy

11

有几种方法可以做到这点,但没有一种是理想的。

  1. 将数据呈现为图像而不是HTML格式。这需要服务器端进行额外的处理,但使用PHP中的图形库不会很难。或者,您可以仅对某些大小的请求(例如所有请求)执行此操作。

  2. 加载页面壳,然后通过AJAX调用检索数据并将其插入DOM中。使用sessions设置必须随AJAX调用一起传递的哈希以进行验证。该哈希仅在一定时间内有效(例如10秒)。这实际上只是添加了一个额外的步骤,某人必须跳过才能获取数据,但可以防止简单的页面抓取。


7

尝试使用Flash或Silverlight作为您的前端。

虽然这不能完全阻止某些人,但会更加困难。如果您通过服务加载数据,则始终可以使用安全连接以防止中间人抓取。


6
对于那些知道方法的人来说,使用 Flash 应用程序进行“刮取”(拦截和重新解释数据)甚至比 HTML 网站更容易,如果 Flash 应用程序将信息作为 AMF 对象发送到页面。 - JAL

6

每个唯一IP每10个页面加载强制使用reCAPTCHA


5

实际上,你没有什么可以做的。你可以尝试寻找一个自动化的过程来检查你的网站,但最终他们还是会获胜。

经验法则:如果你想保守某些信息,请不要将其放在互联网上。


3
把手离开键盘,问一下客户为什么想让数据可见但不能被爬取?
他要求两个不相符的事情,也许通过讨论他的理由会有所收获。
可能他真的不希望它公开访问,你需要添加身份验证/授权。或者他可能决定实际上开放一个API是有价值的。但在询问之前,你不会知道答案。

2

我不知道你为什么会阻止这个。客户提供了数据。

很可能他们以某种独特的方式创造价值,而这种价值并不是数据所能轻易反映出来的。

无论如何。

你可以检查浏览器、屏幕分辨率和IP地址,以确定它是否是某种自动化抓取工具。

大多数像cURL和wget这样的东西——除非经过精心配置——都很明显不是浏览器。


2

使用像Adobe Flex这样的Flash应用程序前端可以解决这个问题。

除此之外,如果您希望用户能够轻松访问,那么用户也很容易复制。


1

这个问题没有简单的解决方案。如果数据是公开可用的,那么它可以被抓取。你唯一能做的就是通过添加/更改HTML而不影响布局使每个条目略微独特,从而使爬虫的生活更加困难。这可能会使使用正则表达式收集数据的人更加困难,但这仍然不是一个真正的解决方案,我认为任何有决心的人都会找到应对方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接