分享

php判断referer来源域进行白名单黑名单访问控制

 昵称13325311 2013-07-29
最近大家有了sinaapp的php空间,这个东西可能可以用得到,写个基本例子大家参考(大家可以二次开发)

基本功能就是最简单的referer防盗链:
1,白名单就是只允许某些来源域
2,黑名单就是不允许某些来源域
 

 
<?php

//开发调试模式:显示错误报告,但不显示通知
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
//上线模式:不显示任何错误报告
error_reporting(0);

//要进行判断的网站域名列表
//仅域名,全小写,注意前面不要加http://
//完全匹配,不支持通配符,需要通配符的可自行去写正则支持
$domain_list = array("", "bbs.", "www.");

//以上列表中的域名是否为黑名单,否则为白名单(默认)
//白名单就是只允许这些来源域
//黑名单就是不允许这些来源域
$is_black_list = FALSE;

//是否允许空来源(默认允许),就是如果来源页为空时,允许通过,否则必须要有正确的来源地址
//比如直接打开没有referer,还有Firefox中,wmp中,可能不一定每次都有referer来源地址
$allow_empty_referer = TRUE;


//回调函数==================================================================

//成功通过验证后要调用的程序,所有要做的事写到这里面
function succeed() {
       
        echo "welcome";
       
}

//错误没有通过验证要调用的程序,比如返回一个错误页面,或返回一个错误信息,或一个含广告的列表
function error() {
       
        echo "error";
       
}


//来源页判断===============================================================
//取得访问来源的地址
$referer = $_SERVER["HTTP_REFERER"];       
if($referer) {
        //解析来源地址
        $refererhost = parse_url($referer);
        //来源地址的主域名
        $host = strtolower($refererhost['host']);
        if($is_black_list) {
                //如果是黑名单
                if (in_array($host, $domain_list)) {
                        error();
                } else {
                        succeed();
                }
        } else {
                //如果是白名单
                if($host == $_SERVER['HTTP_HOST'] || in_array($host, $domain_list)) {
                        succeed();
                } else {
                        error();
                }
        }
} else {
        if ($allow_empty_referer) {
                succeed();
        } else {
                error();
        }
}

?>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多