PHP Mysql CodeIgniter在非常奇怪的情况下将字符转换为符号

时间:2013-12-24 09:19:55

标签: php mysql codeigniter

PHP Mysql CodeIgniter在非常奇怪的情况下将字符转换为符号

  • 基于CodeIgniter构建的应用程序。
  • 已经跑了一年多了。没问题。
  • 客户填写有关客户的表格。
  • 一个简单的修剪($ _ POST ['notes'])捕获textarea表单字段文本并保存到MySQL
  • 在PHP或JavaScript中没有报告错误
  • 前几天我注意到客户输入了一些文字,文字“()”中使用的括号替换为等效的()
  • 我想......“这很奇怪......我不记得为什么这些角色会被替换掉的原因。!”

我看一下......一天后......这是我的疯狂透露:


有问题的文字是逐字的“ 始终在文件上运行信用卡(我们不会向该客户收取提款或退货费用)

无论我在代码方面做了什么或改变了什么......我无法阻止PHP ......或者Javascript ......或者MySQL ......或者外星生物... - 或者无论是谁做的 - 从文本中的“()”转换为() 。我尝试了很多东西,比如用人或神知道的各种方式清理字符串在保存到数据库之前捕获之前发送的字符串。转换将始终发生在保存到MySQL之前。我尝试以不同的形式和字段发布...每次都相同...无法阻止魔术转换为()

蝙蝠侠的名字是什么在这个神奇的文本中导致这种情况发生?是魔法小精灵灰尘撒在godaddy服务器上运行??? 0_o .......

我是天才0_0我决定一次从段落中删除一个单词。 神奇地......随着森林中的所有生物聚集在一起 - 当我最终在段落中找到“ file ”这个词时,将其删除!像魔法一样 - “()”保持为“()”并且转换为() ?!?!???!?!?:\怎么来?我只是从文本中删除了“ file ”这个词......怎么会改变什么?什么是“ file ”这个词会导致更改字符串的保存或转换方式吗?


好的 - 所以我在应用中的任何一个表单字段上测试了这个。在任何字段中,如果您输入单词“文件”,然后输入“”,则会转换第一个) “到(; ,下一个“”到)

所以..如果字符串是:

文件(任意数量的字符或文字)任何其他文字或字符

在帖子上,它将神秘地转换为:

归档(任意数量的字符或文字&#41任何其他文字或字符

从字符串中删除“ file ”一词,您将获得:

(任意数量的字符或文字)任何其他文字或字符

外星生物归还被绑架的“()


任何人都知道这可能会发生什么?


  • 造成这种情况的原因是什么?

  • 单词“file”是否是一种绊倒某种安全措施的关键字?将其拼写为“file()”???


我不知道:\

这是我见过的最奇怪的事情......除了那段时间我走进了爸爸妈妈 0_o

非常感谢任何帮助,我肯定会给你买啤酒。)


非常大的头颅 - (对于这种温柔的自我来说有很大的力量) - Noo-Noos在堆叠处暂停了这个问题为“关闭主题”LOL ...诚实地对待上帝这些家伙太傻了。

所以 - 为了安抚堆栈 - 我会尝试编辑这个问题,以便它......“关于主题”??? 0_o ...什么都适合你哦,所以“国王”Stack Guys O_O - 太糟糕了,你永远不会发现这样的错误...也许有一天。 ;)


示例代码:

    <textarea name="notes">Always run credit card on file (we do not charge this customer for pick-up or return) blah blah</textarea>

<?php 

    if(isset($_POST['notes']){


        $this->db->where("ID = ".$_POST['ID']);
        $this->db->update('OWNER', $_POST['notes']);

    }
?>

产生的MySQL存储空间:
“始终在信用卡&#40;上运行信用卡我们不会向该客户收取任何费用以便提货或退回&#41;等等。”

  • InnoDB - 输入文字utf8_general_ci

我不是在寻找一种方法来阻止它,或者清理它......我明确地问“导致它的原因”

6 个答案:

答案 0 :(得分:6)

/*
 * Sanitize naughty scripting elements
 *
 * Similar to above, only instead of looking for
 * tags it looks for PHP and JavaScript commands
 * that are disallowed.  Rather than removing the
 * code, it simply converts the parenthesis to entities
 * rendering the code un-executable.
 *
 * For example: eval('some code')
 * Becomes:     eval&#40;'some code'&#41;
 */
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2&#40;\\3&#41;", $str);

这是XSS Clean的一部分。 (系统/核心/ Security.php)

如果您希望过滤器每次遇到POST或COOKIE数据时自动运行,您可以通过打开application / config / config.php文件并设置它来启用它:

  

$ config ['global_xss_filtering'] = TRUE;

https://www.codeigniter.com/user_guide/libraries/security.html

答案 1 :(得分:2)

尝试这样的事情

$this->db->set('OWNER', $_POST['notes'],FALSE);
$this->db->where('ID ', $_POST['ID']);
$this->db->update('table_name');  

答案 2 :(得分:1)

使用utf8编码存储这些值。

为了避免注入,请使用mysql_real_escape_string()(或预处理语句)。

为了防止XSS使用htmlspecialchars。

多么不确定你的情况是什么问题.. 可能尝试在字符串中使用其他一些sql关键字并验证解决方案。

答案 3 :(得分:1)

我觉得男人在你的服务器里。如果Ur使用Wamp尝试检查您是否错过了在xhtml中安装一些参数。这是我的想法。这与我在CodeIgniter中的经验有关。希望如果您需要一些建议,U会回复。

答案 4 :(得分:0)

尝试使用str_replace替换&amp;#40和&amp;#41(和)
如果你在数据库中存储&amp;#40和#41,那么你应该尝试在输出时替换它,如果没有尝试并在输入之前替换它。

答案 5 :(得分:0)

我不确定这是否可行,但您可以尝试在“文件”一词之前或之前插入斜杠:

fi\le ( any number of characters or text ) any other text or characters