我创建了一个简单的新闻系统,其中包含使用PHP和MySQL的评论,它在我的Fedora 10计算机和我的Windows 7计算机上的本地Apache服务器上运行良好。现在我遇到了一个问题,我把它上传到了一个网络主机,它不断地将所有'和'作为\'和\“返回。”
我相信这可能是出于安全原因自动添加它们的Web主机,或者MySQL是错误的排序规则,但是我还没有解决它,测试多个MySQL排序规则。
以下是查询示例:
mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());
$time
是time();
$newstitle
和$newstext
是从$_POST
解析的,并且在我运行查询之前都运行mysql_real_escape_string()
(我想这可能是问题所在,但因为它是安全我只是不想删除它,因为它不会导致本地服务器出现问题)
最后一点:在我的本地apache服务器上,我latin1_swedish_ci
无法在网络主机服务器上运行。
修改
它们在数据库中看起来像这样:
\'\'\'\"\"\"
虽然在我的本地,他们没有额外的反斜杠,所以它必须是PHP添加它。有没有办法解决这个问题,除了添加一个删除额外反斜杠的函数?
答案 0 :(得分:7)
这些额外的反斜杠可能是Magic Quotes。在处理数据之前尝试disable them or remove them。
答案 1 :(得分:4)
编辑:如下所述,在评论中,正确的方法是禁用魔术引号。如果我在回复之前完全阅读并理解了这个问题,那么这可能会更好;)
mysql_real_escape_string()
将执行它所说的内容,并转义字符串中的相关字符。转义引号是通过在它们前面加上转义字符(PHP中的反斜杠和许多其他语言)来完成的。 当您从数据库中提取数据时,请执行类似内容的stripslashes()
(请参阅PHP doc),以删除引号之类的斜杠。
编辑:正如Gumbo所提到的,也可能是因为服务器上启用了Magic Quotes。您应该停用这些as per his answer。
答案 2 :(得分:4)
不,你不想运行stripslashes()。而是正确设置服务器。
首先,关闭magic_quotes。这意味着进入脚本的任何数据都不会被转义。
然后对数据运行mysql_real_escape_string(),它将仅为查询添加斜杠,并将数据存储在数据库中而不会使用斜杠。
当你再次加载数据时,你会很高兴,并且引号周围不会出现任何反斜杠。
答案 3 :(得分:3)
查看您的magic_quotes
设置,并在服务器上进行比较。您的家庭服务器可能已禁用magic_quotes
(因为它们应该是,因为当前版本的PHP中为Magic Quotes is deprecated),并且您的Web主机可能已启用它们(这很常见)。您可以使用:
<?php echo phpinfo(); ?>
进行快速比较。
如果magic_quotes对您而言是新手,您可能需要在部署任何您关心的内容之前更多地研究PHP安全性。
答案 4 :(得分:2)
您的主机可能已启用Magic Quotes。
答案 5 :(得分:2)
看看magic_quotes_gpc。你可以通过.htaccess关闭它并使用mysql_real_escape_string()。
答案 6 :(得分:-1)
真正的解决方案是在插入查询中使用预准备语句。
这是一个顶部插入示例的网站。
好处是它是一种最佳实践,副作用是你不再需要担心清除SQL注入攻击的输入。