我有一個多語種網站,改變語言功能的工作原理是這樣的:檢查重定向地址是網站本身 - PHP
change_lang.php?lang=en&return=www.example.com/pages/etc
在change_lang.php我讀了$_GET['return']
和$return_addr = $_GET['return']
然後用header("location:" . $return_addr)
送用戶返回到他,現在想象一下,有人要污染的返回地址的地方:
change_lang.php?lang=en&return=www.HACKER-SITE.com/virus.exe
爲了防止這一點,我想限制$return_addr
值只有本地機器(服務器),我的代碼是:
<?php
if(substr(BASE_URL, 0, 8) == 'https://'){
$start_len = 8;
$return_http = 'https://';
} else{
$start_len = 7;
$return_http = 'http://';
}
$http_extracted_base_url = substr(BASE_URL, $start_len);
if(substr($http_extracted_base_url, 0, 10) == substr($return, 0, 10)){
// OK
}else{
// NOT OK
exit();
}
?>
BASE_URL
是定義我的域名的價值,像http://example.com
,當用戶沒有在講話中使用「WWW」上面的代碼工作得很好,但是當他這樣做,我需要檢查的另一件事在我的代碼中,所有這些都必須有更好的解決方案,這就是我的問題;我應該如何檢查返回URL是否會返回到網站本身,我不想檢查http s
r www,或者我們也可能希望將來有另一個域停放在我們的網站上,因此有些用戶可能會使用第二個地址,並且上面的代碼因爲BASE_URL
被定義爲第一個域而失敗。
P.S:我不想PING
域的返回地址,執行功能在服務器上被禁用。
是'$ _SERVER ['HTTP_REFERER']'這裏沒有問題嗎? – Dale
協議和域名是否必要?如果你只是發送'&return = pages/etc而不是完整的URL,它可以工作嗎?這會讓它變得更簡單。 –
@Dale HTTP_REFERER可以被操縱我在某處讀過,是真的嗎? – behz4d