2014-08-30 67 views

回答

0

你無法分辨接收端的差異。兩種情況下的請求都是相同的,Web服務器將以完全相同的方式爲foo.js服務。如果你控制嵌入javascript的HTML頁面,你可以構建一個令牌/散列方案(很像你可能做的防止CSRF)來驗證文件的請求不是直接請求。例如:

<script src="http://foo.com/foogenerator.js.php?k=SOMERANDOMVALUE"></script> 

有這樣做雖然問題是,它包括具有PHP解析器生成你的JavaScript,而不是它只是作爲一個靜態文件直接由Web服務器提供服務的開銷。它也可能對瀏覽器緩存有影響。

+0

是的。我正在這樣做,以防止CSRF。這有點難 如果是直接請求,它只顯示location.assign(「foo.com」); – thangngoc89 2014-08-30 17:55:21

0

你可以使用你的.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並讓腳本終止。不過,您可能需要設置標題。我不完全確定,現在無法對其進行測試。

+1

請求頭文件可以很容易僞造(它們是由請求者創建的),所以如果這樣做確實很重要,那麼這不是一種限制訪問的傻瓜式方法。僅供參考。 – 2014-08-30 17:27:34

+1

我知道。我提到過,由於某種原因,我想不出「僞造」這個詞。稍後我會改進我的答案,以涵蓋更安全的路線。 – Jakar 2014-08-30 17:43:32

+0

@Jakar .htaccess文件的作用是什麼?我真的不知道這是什麼意思。 如果它將所有.js重定向到js_handler.php,那麼如何知道哪個文件被請求? – thangngoc89 2014-08-30 17:51:08