2013-10-10 37 views
14

當我試圖重定向到其他網站,我收到此錯誤:笨重定向 - 您提交的URI已經不允許的字符

一個PHP錯誤遇到

嚴重性:警告

消息:parse_url(/%22 * * )[function.parse-URL]:無法解析URL

文件名:芯/ URI.php

行號:219


一個錯誤時遇到

您提交已禁用的字符的URI。


這是所有的代碼,我在URI.php

private function _detect_uri() 
{ 
    if (! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) 
    { 
     return ''; 
    } 

    $uri = $_SERVER['REQUEST_URI']; 
    if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) 
    { 
     $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); 
    } 
    elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) 
    { 
     $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); 
    } 

    // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct 
    // URI is found, and also fixes the QUERY_STRING server var and $_GET array. 
    if (strncmp($uri, '?/', 2) === 0) 
    { 
     $uri = substr($uri, 2); 
    } 
    $parts = preg_split('#\?#i', $uri, 2); 
    $uri = $parts[0]; 
    if (isset($parts[1])) 
    { 
     $_SERVER['QUERY_STRING'] = $parts[1]; 
     parse_str($_SERVER['QUERY_STRING'], $_GET); 
    } 
    else 
    { 
     $_SERVER['QUERY_STRING'] = ''; 
     $_GET = array(); 
    } 

    if ($uri == '/' || empty($uri)) 
    { 
     return '/'; 
    } 

    $uri = parse_url($uri, PHP_URL_PATH); 

    // Do some final cleaning of the URI and return it 
    return str_replace(array('//', '../'), '/', trim($uri, '/')); 
} 
+0

正是它所說的 - 你是否試圖在CI源代碼中搜索該錯誤消息,並按照它的路徑來檢查這些字符的正則表達式?我敢打賭,改變這個正則表達式可以解決這個問題... –

回答

46

笨檢查所有URI段爲不允許的字符。這通過白名單允許的字符發生。允許哪些人可以在變量中的/system/application/config/config.php中檢查。 permitted_uri_chars是CodeIgniter在您的URI中接受的字符。默認值設置爲類似的。

$config['permitted_uri_chars'] = 'a-z 0-9~%.:&_\-'; 

默認情況下,只有這些被允許:a-z 0-9~%.:_-

留空,讓所有的人物 - 但前提是你是瘋了。

%22來自"。您可以在permitted_uri_chars列表中添加該項。

+1

是否有可能在每個方法的基礎上設置?意思是說,我想允許@人們提交一個電子郵件地址,但只能用一種方法。我希望它在任何其他地方都被禁止,而不必在每種情況下都檢查它。 – KCL

3

試試這可能會幫助,但not recommended,在application/config/config.php變化:

$config['permitted_uri_chars'] = ''; #keep it blank to allow all characters 
$config['allow_get_array']  = TRUE; 
$config['enable_query_strings'] = TRUE; 
+2

這應該不是一個真正的選擇,我認爲對於PHP新手或者不瞭解安全性的人來說,這將是一場糟糕的教育。 – Metropolis

+0

不錯,這是我的工作,謝謝 –

0

以上的解決方案是完美的,除了第二行($config['allow_get_array'] = TRUE;);它不存在。順便說一下,我正在使用Open-Blog.info博客系統,並且在嘗試打開管理頁面時遇到了這個問題。

相關問題