那么如果客户端是curl,我如何检查使用codeigniter,然后为它返回不同的东西?
答案 0 :(得分:23)
使用cURL时,您可以伪造用户代理,因此根据您知道它是cURL请求时发送的用户代理,这是毫无意义的。
例如:我最近写了一个应用程序,它从谷歌获取网址的页面。现在Google不喜欢这样,所以它只允许某个用户代理访问其pagerank服务器。解?使用cURL和Google欺骗用户代理将不再是明智之举。
故事的道德:cURL用户代理绝不可靠。
如果您仍想这样做,那么您应该能够像通常那样获得传递的用户代理
$userAgent=$_SERVER['HTTP_USER_AGENT'];
编辑快速测试证明了这一点:
dumpx.php:
<?php
$url="http://localhost/dump.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if($_GET['u']==y) {
curl_setopt($ch, CURLOPT_USERAGENT, "booyah!");
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
//curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 0);
$exec=curl_exec ($ch);
?>
dump.php:
<?php
var_dump($_SERVER);
?>
案例1:http://localhost/dumpx.php?u=y
'HTTP_USER_AGENT' => string 'booyah!' (length=7)
案例2:http://localhost/dumpx.php?u=n
没有$ _SERVER ['HTTP_USER_AGENT']
这证明curl没有默认的用户代理:它不会在请求标头中传递它
答案 1 :(得分:3)
如果要检测机器人,则不能依赖用户代理。最佳做法是:
答案 2 :(得分:2)
cURL代表 - 客户端URL库,它的全部意义是能够发出与客户端相同的请求。
您唯一能做的就是检测作为请求一部分的信息,例如IP地址,HTTP请求标头,Cookie /会话ID cookie,URL(路径/页面)以及任何发布/获取数据。如果使用curl发出请求的人是从预期的IP地址执行此操作并提供任何预期的header / cookie / token / URL / post / get值,那么您将无法区分curl请求和浏览器制作请求。
答案 3 :(得分:1)
使用cURL时,您可以欺骗或设置自定义用户代理标头,因此不可靠。
否则,你可以这样做:
if(strtolower($this->input->server('HTTP_USER_AGENT', true)) == 'curl')
{
// Is using cURL
}
仅当cURL请求在用户代理标头中包含curl
时才会出现此情况。
据我所知,在执行curl请求时没有设置默认的用户代理。