Disallowed Key Characters發生原因及處理

cookie
如有使用CodeIgniter Web Framework的經驗,也許會遇到disallowed key characters錯誤的經驗。會出現這樣的訊息,是因為CodeIgniter會檢查client端送來的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名稱的組成規範
A can 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名稱要包含『@』…


參考資料

留言