5

我有用户输入他们的名字,如:O'riley.

在将此数据输入 MySQL 数据库之前,我运行mysql_real_escape_string.

问题是,当我选择此数据进行显示并稍后使用时,它会显示为:O\'riley.

显然,这是预期的操作。我想知道是否有某种方式可以确保我可以将它存储在数据库中(仍然可以安全地逃避可能的恶意代码),这样我就不必strip_slashes()每次在整个网络中调用数据时都使用输出应用程序?或者,我在这里遗漏了什么?

谢谢。

更新 请参阅 Deceze 回答中的评论。

4

9 回答 9

10

不,将字符串存储为“O\'riley”不是预期的操作;它应该只在查询中转义,但不能以这种方式存储。我猜 PHP 通过Magic Quotes放入反斜杠,然后您再次转义它以使其粘住。

禁用魔术行情

于 2012-02-15T00:52:13.167 回答
4

我个人总是关闭魔术引号,因为它正在做我没有告诉它做的事情。如果您无法将其关闭,请考虑将此代码包含在所有页面的顶部。

if (get_magic_quotes_gpc()) {
    function strip_array($var) {
        return is_array($var)? array_map("strip_array", $var):stripslashes($var);
    }

    $_POST = strip_array($_POST);
    $_SESSION = strip_array($_SESSION);
    $_GET = strip_array($_GET);
}
于 2012-06-03T04:18:33.460 回答
4

如果您禁用了魔术引号,并且在 get_magic_quotes_gpc 返回 1 并且您执行了类似@Michael显示的操作并且仍然发生这种情况的情况下,可能会启用魔术引号运行时。

在进行数据库查询甚至写入文件时,魔术引号运行时会在字符串中添加斜杠。要在当前执行的脚本中禁用此功能,请执行以下操作:

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime())
{
    set_magic_quotes_runtime(false);
}

如果可以的话,您也可以通过禁用此配置选项php.ini。但是,如果您不能通过php.ini永久禁用它,您可能需要在之前添加 @get_magic_quotes_runtime并且如果设置为记录此类错误set_magic_quotes_runtime,PHP 可能会通过 E_DEPRECATED 错误(这将变得相当烦人)。error_reporting

于 2012-06-04T00:06:53.583 回答
4

好的,这是你需要做的。首先,根据评论,从其他问题:

隔离

您需要确定导致问题的原因。是服务器吗?是某处隐藏的代码吗?什么?一些程序员可能会在配置页面上包含这样的代码:

<?php if (isset($_POST)) 
    foreach ($_POST as $key => $value) $_POST[$key] = addslashes($value); 
?>

所以这里有一些检查,看看它是否是服务器。这是一种尽可能可靠的检查方式。创建一个页面。将其完全留空并添加以下代码:

<?php print_r($_POST); ?>
<form action="" method="POST">
<input type="text" name="test" value="O'riley" />
<input type="submit" name="submit" value="submit" />
</form>

保存并在浏览器中加载。点击提交。看看斜线是否仍然添加。

如果它仍在添加它,您需要对您的服务器/配置进行故障排除。如果它是您支付的服务器,您需要告诉他们修复它或推动它。如果它是您自己的服务器,那么您将需要做一些混乱/谷歌搜索来弄清楚如何关闭魔术引号。

如果没有出现引号,那么肯定有一些代码在您的帖子变量中添加了斜杠。但是,它可能不像上面的代码那么明显。您需要在您的代码中搜索“addslashes”、“mysql_real_escape_string”,可能还有“str_replace”。如果您发现其中之一,则需要禁用它。但请注意,这可能会破坏您网站的其他假设此操作正在发生的部分。您将其存储在数据库中的另一个选择是执行类似于上面代码的功能,但改为在其上运行 stripslashes。然后您可以稍后在其上运行 mysql_real_escape_string。(更多不必要的开销。)

于 2012-06-05T01:53:48.177 回答
3

利用

var_dump(get_magic_quotes_gpc());

接近实际使用发布数据的某个地方,看看魔术行情是否真的关闭了。

此外,一些奇怪的框架可能会为您添加所说的引号,因此请 grep 您的代码addslashes和其他escape_string类似的功能。

于 2012-05-30T01:03:16.597 回答
2

老实说,我会建议使用 PDO。

PDO 使用准备和执行语句,这反过来又增加了安全性并消除了一些额外的麻烦。

$pdo = new PDO();
$stm = $pdo->prepare('INSERT... (LastName) VALUES (:LastName)');
$stm->execute(array(':LastName' => "O'Rily"));

$stm->fetchAssoc(PDO::FETCH_ASSOC);

您不再需要担心删除转义斜杠以及保护基本的 sql 注入策略。

于 2012-06-04T16:12:07.227 回答
0

可能在您的 httpd.conf 或虚拟主机声明中打开了魔术引号。

确切的位置和文件将取决于操作系统和发行版。我会检查 Apache 配置文件中的 php_flag 设置。

于 2012-06-05T04:09:31.100 回答
-1

谢谢大家的回答。我将奖励+50,但我想在这里告诉我真正的解决方案,所有这些人都提供了帮助......

mysql_real_escape_string在所有数据发布后(在任何处理之前)就对其进行了处理。因此,添加了一个斜杠来转义'提交的字符。这,我们知道是正常的。

但是,反斜杠没有理由\出现在 DB 条目中,对吧?逃生是为了确保'进入。

事实证明,在转义之后,我会保存要在会话中重新加载到页面的变量,以防用户在验证所有表单字段时遇到 PHP 发现的错误。在这种情况下,用户的输入(以前O'riley现在以 . 的形式打印到他们的屏幕上O\'riley。然后,用户没有捕捉到这一点 - 所以他们通常会修复 PHP 在验证期间捕捉到的错误(与名称字段无关),因此将O\'riley登陆数据库,因为mysql_real_escape_string会转义字符。

课程:处理表格时,首先保存数据以供表格重新填写使用。第二次验证表单字段。第三转义数据以处理到数据库中。

或者更好的是,使用 PDO 并避免这种情况 =)。

欢迎评论。谢谢大家!

于 2012-06-07T00:52:30.250 回答
-1

只需在插入数据库之前使用清理数据,

function check_input($value)
{
    if( get_magic_quotes_gpc() )
    {
        $value = stripslashes( $value );
    }

    //check if this function exists
    if( function_exists( "mysql_real_escape_string" ) )
    {
        $value = mysql_real_escape_string( $value );
    }

    //for PHP version < 4.3.0 use addslashes
    else
    {
        $value = addslashes( $value );
    }

    return $value;
}


$cleandata = check_input($value);

$sql = "INSERT INTO `table_name` SET `field_name`='".$cleandata."'";

在获取数据并显示其中使用stripslashes($val)

于 2012-06-05T08:13:03.120 回答