[英]Prevent direct access to a php file that would be loaded in another server
我有這個文件 style.php 將用作幾個域的主要 css 樣式。 此 style.php 文件將在“網站 1”上可用,而其余網站將從網站 1 加載它。
對於網站 1。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="style.php">
</head>
<body>
</body>
對於網站 2。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="https://website1.com/style.php">
</head>
<body>
</body>
對於網站 3。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="https://website1.com/style.php">
</head>
<body>
</body>
其他幾個網站也是如此。
現在這是我想做的事情,我不想直接訪問網站 1 的 style.php。例如,如果用戶訪問https://website1.com/style.php ,他不應該可以訪問它。
這就是問題所在,當我使用 .htaccess 拒絕訪問它時,網站 2 和 3 將無法加載 css。
我可以對 style.php 進行任何可能的調整,以便當用戶訪問https://website1.com/style.php時,他將無法訪問它,但當它用作樣式表時網站2和3,它會正常加載css嗎?
最簡潔的答案是不”。
更長的答案是你對當前正在發生的事情有一個不正確的心理模型。 您想象當您從網站 2 引用樣式表時,請求以某種方式“來自”該網站。 實際發生的是這樣的:
您的兩台服務器在任何時候都不會相互通信; 他們總是從瀏覽器接收請求並向瀏覽器發送響應。 如果服務器在第 5 步拒絕請求,瀏覽器將永遠不會知道樣式表包含什么,因此只會呈現沒有這些樣式的頁面。
考慮到這一點,我們可以重新提出問題:
我能否確定瀏覽器請求 URL 的原因,以區分在地址欄中鍵入 URL 的用戶與在我的一個站點上使用的樣式表。
答案可能是:瀏覽器可以發送一個名為“REFERER”的 HTTP 標頭(是的,這是“referrer”的拼寫錯誤,但很久以前它就成為標准了),它為 URL 提供了請求“來自“ 在某種意義上。 對於直接鍵入的 URL,它將始終為空; 對於樣式表 URL,它可能是包含頁面。 您可以在 PHP 中以$_SERVER['HTTP_REFERER']
形式訪問它,或者在 Apache 配置中通過將RewriteCond %{HTTP_REFERER} some-pattern-to-match
放在RewriteRule
前面來訪問它。
但是,出於隱私原因,瀏覽器最近對在域之間傳遞引薦來源信息變得更加嚴格,因此在您的情況下它可能是空白的。
同樣重要的是要注意請求中的所有內容都在用戶的完全控制之下,並且響應中的所有內容對用戶都是完全可見的。 一旦你發現這是需要的,發送帶有假 REFERER 標頭的請求是微不足道的。 在使用樣式表的站點上查看樣式表更加簡單——在大多數瀏覽器中,按 F12 將彈出“開發人員工具”,您可以在其中查看服務器發送的所有內容。
因此,如果您希望以某種方式“保密”這些樣式,那您就不走運了。 用戶需要能夠看到瀏覽器的樣式才能使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.