0

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

CodeIgniter - 不允许的关键字符

CodeIgniter 不允许的键字符

Codeigniter (v2) 中不允许的键字符错误消息

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

我启用了 CSRF 保护,并且我在表单字段名称中使用了数组(即 search[] 作为名称,因为有多个选择下拉选项)。我有一种感觉是表单名称中的“[]”困扰了这个表单。

我已经遵循了我在上面的帖子中看到的所有建议。

  1. 我暂时禁用了 CSRF,
  2. 我暂时禁用了 XSS,
  3. 我编辑了 $config['permitted_uri_chars'] 和
  4. 我编辑了生成此消息的 Input.php。

有人对在表单提交时可能导致此问题的原因有任何其他想法吗?

谢谢!

4

2 回答 2

3

就像我在这里的回答一样——您只需要更新 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'
      );
  }
}
于 2017-05-23T19:18:09.333 回答
0

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

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

希望这个答案(以及激发它的评论)对其他人有所帮助。

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

问候

于 2013-02-18T18:44:31.723 回答