首頁 >後端開發 >PHP問題 >php如何實現禁止跨域訪問

php如何實現禁止跨域訪問

王林
王林原創
2021-06-10 14:22:293381瀏覽

php實作禁止跨域存取的方法是,判斷HTTP Referer,如果沒有Referer或Referer是在非本地存取的,那麼就禁止存取。

php如何實現禁止跨域訪問

本文操作環境:windows10系統、php 7.3、thinkpad t480電腦。

我們可以透過以下兩種方式來實現禁止跨域存取。

方法一:判斷HTTP Referer

HTTP Referer是header的一部分,當瀏覽器向web伺服器發送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器以此可以獲得一些資訊來處理。

在 post 請求 “文件” 或 “函數” 的最開始地方加入判斷 HTTP Referer:以下為 php 程式碼,不語言做法相同。

  • 沒有 Referer ,屬於直接存取連線。如 http://www.a.com/ajax.php 返回 error

  • 有 Referer ,但不是本站訪問,Referer 不包含 a.com domain。回傳error

// 如果(没有 Referer 或者 Referer 非本地访问的)return 'error' 或 die() 程序结束
if(!isset($_SERVER['HTTP_REFERER']) || !strstr($_SERVER['HTTP_REFERER'], 'http://www.a.com/')){
    echo "error";
    die();
}

方法二:伺服器端禁止跨網域存取

Nginx禁止跨網域存取某個PHP檔案

location ~ \.php$ {
    ...

    #新增代码 start -------------------------------------

    # 假设 ajax.php 文件路径是 /includes/ajax.php 和网站域名是 www.a.com

    # 新增一个变量 $nolocal 值为 1
    set $nolocal 1;

    #下面开始判断,不是 POST 或者请求路径不是 ajax.php 的路径或者请求来源属于本站域名时,都设为 0

    #因为 nginx 不支持多条件判断,这里用三个 if ~
    if ($request_method != POST) {
        set $nolocal 0;
    }
    if ($request_uri != /includes/ajax.php) {
        set $nolocal 0;
    }
    if ($http_referer ~* "www.a.com") {
        set $nolocal 0;
    }

    #经过上面的筛选,值是 1 的,也就是本站外来源POST ajax.php 数据过来,直接返回 403 拒绝处理
    #这样,其他来源的请求就浪费不了你的PHP进程了。
    if ($nolocal) {
        return 403;
    }

    #新增代码 end -------------------------------------

    ...
}

免費學習影片分享:php影片教學

以上是php如何實現禁止跨域訪問的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn