【问题标题】:How to block some of http user agent using php如何使用 php 阻止一些 http 用户代理
【发布时间】:2009-08-31 15:23:16
【问题描述】:

有没有办法通过 php 脚本阻止一些用户代理?关于 mod_security 的示例

SecFilterSelective HTTP_USER_AGENT "Agent Name 1"
SecFilterSelective HTTP_USER_AGENT "Agent Name 2"
SecFilterSelective HTTP_USER_AGENT "Agent Name 3"

我们也可以通过示例使用 htaccess 或 robots.txt 来阻止它们,但我想要在 php 中。有示例代码吗?

【问题讨论】:

    标签: php user-agent


    【解决方案1】:

    我喜欢@Nerdling 的回答,但如果它有帮助,如果您有很长的用户代理列表需要被阻止:

    $badAgents = array('fooAgent','blahAgent', 'etcAgent');
    foreach($badAgents as $agent) {
        if(strpos($_SERVER['HTTP_USER_AGENT'],$agent) !== false) {
            die('Go away');
        }
    }
    

    更好:

    $badAgents = array('fooAgent','blahAgent', 'etcAgent');
    if(in_array($_SERVER['HTTP_USER_AGENT'],$badAgents)) {
        exit();
    }
    

    【讨论】:

    【解决方案2】:

    您应该避免为此使用正则表达式,因为这会添加大量资源来决定阻止连接。相反,只需使用 strpos() 来检查字符串是否存在

    if (strpos($_SERVER['HTTP_USER_AGENT'], "Agent Name 1") !== false
     || strpos($_SERVER['HTTP_USER_AGENT'], "Agent Name 2") !== false
     || strpos($_SERVER['HTTP_USER_AGENT'], "Agent Name 3") !== false) {
        exit;
    }
    

    【讨论】:

    • 为什么你认为使用正则表达式“会增加很多资源”?
    • 因为 PHP 的网站是这么说的。
    • 您应该使用 strpos( $str ) !== false,因为子字符串可以定位在索引 0 处,并且测试 > 0 会失败。 strpos() 页面上有一个关于类型测试的注释。
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多