CURL用户代理

时间:2011-11-19 14:49:58

标签: php codeigniter curl user-agent

那么如果客户端是curl,我如何检查使用codeigniter,然后为它返回不同的东西?

4 个答案:

答案 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)

如果要检测机器人,则不能依赖用户代理。最佳做法是:

  1. 检查您的访问者是否运行js(并非所有人类用户都这样做)。
  2. 检查您的访问者是否加载了链接到网页的其他文件(css,图片等)
  3. 检查访客超时。人类通常不会每秒加载10页。

答案 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请求时没有设置默认的用户代理。