CodeIgniter:不允许使用关键字符

时间:2013-02-18 18:36:47

标签: codeigniter csrf

我和下面的人有同样的问题,但为他们提供的解决方案对我不起作用。

CodeIgniter - disallowed key characters

CodeIgniter Disallowed Key Characters

Disallowed key characters error message in Codeigniter (v2)

我提交表格时会收到“不允许的关键字符”。

我启用了CSRF保护,并且我在表单字段名称中使用数组(即,搜索[]作为名称,因为有多个选择下拉选项)。我觉得形式名称中的“[]”会影响这种形式。

我已遵循上述帖子中的所有建议。

  1. 我暂时禁用了CSRF,
  2. 我暂时禁用了XSS,
  3. 我编辑了$ config ['allowed_uri_chars']和
  4. 我编辑了生成此消息的Input.php。
  5. 任何人对表单提交中可能导致此问题的内容有任何其他想法吗?

    谢谢!

2 个答案:

答案 0 :(得分:1)

与我的回答here一样 - 您只需更新MY_Input-> _clean_input_keys()中的正则表达式以允许更多字符(例如,转义的JSON或转义的HTML / XML)

仅允许英语' !preg_match("/^[a-z0-9\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str)

允许使用中文字符: !preg_match("/^[a-z0-9\x{4e00}-\x{9fa5}\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str)

我的完整工作功能如下:

  public function _clean_input_keys($str) {
    // NOTE: \x{4e00}-\x{9fa5} = allow chinese characters
    // NOTE: 'i' — case insensitive
    // NOTE: 'u' — UTF-8 mode
    if (!preg_match("/^[a-z0-9\x{4e00}-\x{9fa5}\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str)) {
      /**
      * Check for Development enviroment - Non-descriptive
      * error so show me the string that caused the problem
      */
      if (is_env_dev()) {
        var_dump($str);
      }

      exit('Disallowed Key Characters.');
    }

    // Clean UTF-8 if supported
    if (UTF8_ENABLED === TRUE) {
      return $this->uni->clean_string($str);
    }

    return $str;
  }

<强> my_helper.php

if (!function_exists('is_env_dev')) {
  function is_env_dev() {
    return (
        defined('ENVIRONMENT') && strtolower(ENVIRONMENT) == 'development' ||
        defined('ENVIRONMENT') && strtolower(ENVIRONMENT) == 'testing'
      );
  }
}

答案 1 :(得分:0)

谢谢,但我在下面的另一篇文章中发现了一条隐藏在下方的评论(位于撰写本文时的底部):CodeIgniter Disallowed Key Characters

评论建议我将$ str添加到exit()注释中进行测试。这表明我的表单字段中缺少双引号。它是一个动态构建的非常复杂的表单,有300行代码,很容易错过。

希望这个答案(以及启发它的评论)能够帮助其他人。

验证输出源可以防止出现这样的问题: - )

此致