2012-12-15 43 views
0

我有一個多語種網站,改變語言功能的工作原理是這樣的:檢查重定向地址是網站本身 - 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域的返回地址,執行功能在服務器上被禁用。

+0

是'$ _SERVER ['HTTP_REFERER']'這裏沒有問題嗎? – Dale

+0

協議和域名是否必要?如果你只是發送'&return = pages/etc而不是完整的URL,它可以工作嗎?這會讓它變得更簡單。 –

+0

@Dale HTTP_REFERER可以被操縱我在某處讀過,是真的嗎? – behz4d

回答

1

我會建議使用$_SERVER['HTTP_REFERER']或您定義BASE_URL

<?php 

    // your language handling code 

    $redirect = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : BASE_URL; 
    header("Location: {$redirect}\r\n"); 
    exit; 

我會補充說,雖然這可以被操縱(所以我被告知)當然,唯一會影響的人是操縱該標題的用戶,因爲他們正在被重定向?

+0

不是那種可以僞造的價值。 – brunoais

+0

@brunoais我不知道,謝謝你的提醒! – Dale

+0

使用這個,我們仍然可能需要檢查www和http或httpS – behz4d

1

你可以做的是寫一個函數,它在2個網址,一個是return=URL,另一個是說.. $_SERVER['PHP_SELF']/$_SERVER['REQUEST_URI']/$_SERVER['DOCUMENT_ROOT']

例如:

function secure_url($server_url, $get_url) { 
    //do function stuff 
    //check URLs to see if the return parameter matches the URL of your site 
    //might have to strip any extra URL data for comparison 
    if ($bad_url) exit; 
} 
+0

有些用戶可能會使用'httpS'而不是'http',有些用戶可能會在地址上使用'www',有些用戶可能不會,有些用戶可能會使用第二個域名地址,有些用戶可能會使用第一個網站地址,真的沒有更好的方法嗎? – behz4d