防止我的网站发出cURL请求

4
我有一个包含大量产品和价格的网站。
我的价格一直被不断地cURLed。

我想通过<noscript>标签阻止它,但我能做的只是隐藏内容,爬虫仍然可以抓取我的内容。

是否有一种运行JS测试来检测JS是否被禁用(以检测爬虫),并重定向这些请求,也许在黑名单中。

这样做会阻止谷歌通过我的网站吗?


你可以拒绝没有 userAgent 的请求(但使用 cURL 可以绕过此限制),或者将 Google、Facebook、Twitter 等机器人的 userAgent 加入白名单。 - Adam Azad
只要数据是公开的,就没有简单的自动化解决方案。机器人总是可以被重写以绕过您的检查。 - John V.
为什么不使用htaccess按IP或位置阻止机器人? - Vincent Decaux
你可能想使用一些身份验证或使用 cookies 跟踪用户。 - source.rar
@VincentDecaux 他们只是更改了他们的IP地址,这不会持续太久。 - Nir Tzezana
显示剩余2条评论
3个回答

1
你需要创建一个阻止列表并阻止ip访问内容,所有头信息包括引荐和用户代理都可以在curl中非常容易地使用以下简单代码设置。
$agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL, 'http://www.yoursite.com?data=anydata');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://www.yoursite.com');
$html = curl_exec($ch);

上述操作将使curl请求看起来像是使用Firefox浏览器的正常连接。

1

由于CURL只是一个HTML请求,您的服务器无法区分,除非您限制某些URL的访问或检查引荐URL并实施过滤器以防止任何未经本地引荐的内容。可以在此处找到构建检查的示例:

检查引用者


发送请求时,我可以使用任何引用来源。这只是另一个标头。 - PeeHaa
1
我并没有说伪造是不可能的,我说它是一种可行的选择,如果不是唯一的话,也是过滤传入的HTTP请求的几种方式之一。不知道为什么人们会对有效和有帮助的建议进行负面评价。与其点踩,为什么不发表更好的解决方案呢? - Silvertiger
答案并不正确。正确的答案是:你不能这样做。 - PeeHaa
有一种方法可以做到这一点,只是这不是它。 - pguardiario

1
你可以通过检查 User Agent 来阻止未伪造的 cURL 请求。据我所知,没有一个搜索引擎爬虫在其用户代理字符串中包含cURL,因此这不应该阻止它们。
if(stripos($_SERVER['HTTP_USER_AGENT'],'curl') !== false) {
    http_response_code(403); //FORBIDDEN
    exit;
}

请注意,更改请求的字符串非常简单,因此某些人可以轻松绕过此限制。

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