2013-10-10 38 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博客系统,并且在尝试打开管理页面时遇到了这个问题。

相关问题