Disallowed Key Characters發生原因及處理
如有使用CodeIgniter Web Framework的經驗,也許會遇到disallowed key characters錯誤的經驗。會出現這樣的訊息,是因為CodeIgniter會檢查client端送來的cookie名稱。
如果先不分析問題發生原因、想馬上解決,可下手調整判斷程式的正規表達式即可
註:程式在/system/core/Input.php
最近發現Adobe的相關系統中,有個系統會產生如下的cookie。當中的%4就是『@』
解決方式,除了上述調整檢查的正規表達式。另一個就是把cookie名中含有『@』的cookie移除
但…不理解為何Adobe的cookie名稱要包含『@』…
如果先不分析問題發生原因、想馬上解決,可下手調整判斷程式的正規表達式即可
註:程式在/system/core/Input.php
protected function _clean_input_keys($str, $fatal = TRUE)
{
if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) //改這裡
{
if ($fatal === TRUE)
{
return FALSE;
}
else
{
set_status_header(503);
echo 'Disallowed Key Characters.';
exit(7); // EXIT_USER_INPUT
}
}
// Clean UTF-8 if supported
if (UTF8_ENABLED === TRUE)
{
return $this->uni->clean_string($str);
}
return $str;
}
為何CodeIgniter會如此檢查cookie name?在Set-Cookie - HTTP | MDN中有提到cookie名稱的組成規範
Acan be any US-ASCII characters, except control characters, spaces, or tabs. It also must not contain a separator character like the following: ( ) < > @ , ; : \ " / [ ] ? = { }.
最近發現Adobe的相關系統中,有個系統會產生如下的cookie。當中的%4就是『@』
AMCV_1FD6776A524453CC0A490D44%40AdobeOrg.
當上述的cookie名稱遇到了CodeIgniter檢查機制,結果就是… disallowed key characters …
解決方式,除了上述調整檢查的正規表達式。另一個就是把cookie名中含有『@』的cookie移除
但…不理解為何Adobe的cookie名稱要包含『@』…
留言