我刚搬到新的托管公司,现在每当使用以下字符串进行转义时
mysql_real_escape_string($str);
斜杠保留在数据库中。这是我第一次看到这种情况发生,因此我的脚本都没有使用
stripslashes()
了。
这是在一个运行php 5.2.6的CentOS 4.5 64bit上作为lighttpd 1.4服务器上的fastcgi。我确保所有magic_quotes选项都关闭,mysql客户端api是5.0.51a。
我在所有6个网络服务器上都遇到了同样的问题。
任何帮助都将不胜感激。
感谢。
答案 0 :(得分:16)
您移动的主持人可能已启用magic_quotes_runtime
。您可以使用set_magic_quotes_runtime(0)
将其关闭。
请关闭magic_quotes_runtime
,然后更改代码以使用绑定变量,而不是使用字符串转义。
答案 1 :(得分:4)
我可以想到许多可能导致这种情况的事情。但这取决于您如何调用SQL查询。如果你移动使用像PDO这样的参数化查询,则不需要转义,这意味着对mysql_real_escape_string
的调用正在添加额外的斜杠。
如果你正在使用mysql_query
等,那么必须有一些像addslashes
这样的代码。这可能是在数据进入数据库之前,也可能是在数据之后。
另外你说你已经禁用了魔法引号......如果你还没有,只需在代码中用这样的东西进行一次硬盘检查:
echo htmlentities($_GET['value']); // or $_POST, whichever is appropriate
确保该值中没有斜杠,然后检查:
echo "Magic quotes is " . (get_magic_quotes_gpc() ? "ON" : "OFF");
我知道你已多次说它不是魔术引号,但对于我们这些人来说,我们需要确保你已经检查了实际的PHP输出,而不仅仅是更改了配置(这可能没有用)
答案 2 :(得分:2)
.htaccess
的根目录中创建一个文件并将其放入其中:
php_flag magic_quotes off
如果由于某种原因无法实现,或者您想更改应用程序以便能够处理魔术引号,请使用此技术:
不是直接访问请求变量,而是使用函数。然后,该函数可以检查魔术引号是打开还是关闭,并相应地去掉斜杠。简单地在一切上运行stripslashes()是行不通的,因为你将摆脱你真正想要的斜线。
function getVar($key) {
if (get_magic_quotes_gpc()) {
return stripslashes($_POST[$key]);
} else {
return $_POST[$key];
}
}
$x = getVar('x');
现在您已经准备好了,所有传入的变量都可以再次转义,mysql_real_escape_string()
不会填满它们。
答案 3 :(得分:2)
斜杠保留在数据库中。
这意味着您的数据会被双重转义。
有两个可能的原因:
魔术引语仍然。仔细检查
您的应用程序中有一些代码,只是模仿魔术引号行为,逃避所有输入。
这是一种非常常见的误解,它具有一般的转义函数来“保护”所有传入的数据。虽然它没有任何好处,但它也对这样的案件负责。
这样 - 只需找到该功能并将其擦除即可。
答案 4 :(得分:0)
你必须打开魔法引号。弄清楚如何关闭它可能是PHP中的一个令人头痛的问题。虽然您可以使用set_magic_quotes_runtime(0)
关闭魔术引号,但这还不够 - 此时魔术引号已经改变了输入数据,因此您必须撤消更改。尝试使用此代码段:http://talks.php.net/show/php-best-practices/26
或者更好 - 禁用php.ini
中的魔术引号,以及可以设置的任何.htaccess文件。
答案 5 :(得分:0)
我不确定我是否正确理解了这个问题,但我遇到了同样的问题。无论我做了什么,当字符串被逃脱时,斜线就在那里。因为我需要插入的值与我输入的格式完全相同
htmlentities($inserted_value)
这会使所有插入的引号都没有转义但无害。
答案 6 :(得分:0)
在同一个var上多次使用mysql_real_escape_string()
会出现什么问题(与我们同在)。多次使用时,会添加斜杠。
答案 7 :(得分:-1)
下面的函数将在插入数据库之前正确删除斜杠。我知道你说魔术引号没有打开,但有些东西正在添加斜线,所以请尝试以下页面并查看输出。它将有助于弄清楚在哪里。使用page.php调用?var = something-with'data_that; will`be | escape
您很可能会看到第三个输出比所需更多的斜杠。
*也可以更改数据库详细信息。
<?php
$db = mysql_connect('host', 'user', 'pass');
$var = $_REQUEST['var'];
echo "1: $var :1<br />";
echo "2: ".stripslashes($var)." :2<br />";
echo "3: ".mysql_real_escape_string($var)." :3<br />";
echo "4: ".quote_smart($var)." :4<br />";
function quote_smart($value)
{
// Stripslashes is gpc on
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if ( !is_numeric($value) )
{
$value = mysql_real_escape_string($value);
}
return $value;
}
&GT;
答案 8 :(得分:-4)
mysql_real_escape_string($str);
应该这样做。它旨在向特殊字符添加反斜杠,尤其是当您要将查询传递给mysql时。请注意,它还考虑了mysql的字符集。
对于更安全的编码实践,最好编辑代码并使用stripslashes()
读取数据并删除斜杠。