如何使用php輸出js文件並檢測文件是否被嵌入或直接連接 我想用php輸出一些js文件 這很簡單,如:如何使用PHP輸出js文件並檢測文件是嵌入還是直接打開
header(Content-Type: text/javascript);
但我想知道,如果該文件是嵌入在網頁內等:
<script src='http://foo.com/foo.js'></script>
或者是直接在瀏覽器中打開在http://foo.com/foo.js 感謝
如何使用php輸出js文件並檢測文件是否被嵌入或直接連接 我想用php輸出一些js文件 這很簡單,如:如何使用PHP輸出js文件並檢測文件是嵌入還是直接打開
header(Content-Type: text/javascript);
但我想知道,如果該文件是嵌入在網頁內等:
<script src='http://foo.com/foo.js'></script>
或者是直接在瀏覽器中打開在http://foo.com/foo.js 感謝
你無法分辨接收端的差異。兩種情況下的請求都是相同的,Web服務器將以完全相同的方式爲foo.js服務。如果你控制嵌入javascript的HTML頁面,你可以構建一個令牌/散列方案(很像你可能做的防止CSRF)來驗證文件的請求不是直接請求。例如:
<script src="http://foo.com/foogenerator.js.php?k=SOMERANDOMVALUE"></script>
有這樣做雖然問題是,它包括具有PHP解析器生成你的JavaScript,而不是它只是作爲一個靜態文件直接由Web服務器提供服務的開銷。它也可能對瀏覽器緩存有影響。
你可以使用你的.htaccess
重新路由請求到PHP文件,如:(我沒有測試它,但它應該工作,我認爲)
Options -MultiViews
RewriteEngine on
RewriteBase/
#if not a directory and ends in .js, then rewrite URL to /dir/js_handler.php and append the query string
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.js$
RewriteRule ^(.+)$ /dir/js_handler.php [L,QSA]
你.htaccess
文件通常會在根您的網站,或者你可以把它放在包含所有JavaScript文件的文件夾中。
然後在您的js_handler.php
文件中,您可以進行某種檢查。
最簡單的(但不是安全)選項是:
if ($header['Referer']=='mydomain.com'){
//it was requested by loading the HTML page
} else {
//it was requested directly
}
要獲得$header
看到this post。
更徹底的路線是使用隨機生成的訪問密鑰並進行驗證。您可以讓cron作業每隔五分鐘左右生成一個新密鑰並使用SQL或將其寫入文件。例如:
$file_path = //some path
$randKey = generateRandomKey();
$keyArray = json_decode(file_get_contents($file_path),true);
$keyArray[1] = $keyArray[0];//move the first element to the 2nd.
$keyArray[0] = $randKey; //set the first element to $randKey
file_put_contents($file_path,json_encode($keyArray));
然後,當你提供一個HTML頁面(假設你通過PHP做):
<?php
$keyArray = json_decode(file_get_contents($file_path),true);
$randKey = $keyArray[0];
?>
<head>
<script type="text/javascript"
src="/path/to/myscript.js?secret=<?=$randKey?> ></script>
</head>
然後在js_handler.php
:
$keyArray = json_decode(file_get_contents($file_path),true);
if (in_array($_GET['secret'],$keyArray){
//deliver the js file
} else {
//deliver 404 page
}
對於位置該腳本使用$_SERVER['REQUEST_URI']
。你應該只能使用javascript文件include
並讓腳本終止。不過,您可能需要設置標題。我不完全確定,現在無法對其進行測試。
請求頭文件可以很容易僞造(它們是由請求者創建的),所以如果這樣做確實很重要,那麼這不是一種限制訪問的傻瓜式方法。僅供參考。 – 2014-08-30 17:27:34
我知道。我提到過,由於某種原因,我想不出「僞造」這個詞。稍後我會改進我的答案,以涵蓋更安全的路線。 – Jakar 2014-08-30 17:43:32
@Jakar .htaccess文件的作用是什麼?我真的不知道這是什麼意思。 如果它將所有.js重定向到js_handler.php,那麼如何知道哪個文件被請求? – thangngoc89 2014-08-30 17:51:08
是的。我正在這樣做,以防止CSRF。這有點難 如果是直接請求,它只顯示location.assign(「foo.com」); – thangngoc89 2014-08-30 17:55:21