【问题标题】:Escaping and Inserting Serialized Data to MySQL将序列化数据转义并插入到 MySQL
【发布时间】:2011-08-11 15:24:56
【问题描述】:

我以以下数据为例:

$a = addslashes('hello\'s');
$b = serialize($a);

// As you know, $b looks like this s:8:"hello\'s";

现在,当我将 $b 插入 MySQL 时,数据现在看起来像 MySQL 中的 s:8:"hello's"。 MySQL 删除了 \,现在我有一个无效的序列化数据。

解决此问题的最佳方法是什么?谢谢

【问题讨论】:

  • 我认为 PHP 中没有 escape() 函数

标签: php mysql


【解决方案1】:

要转义参数以进入 SQL 查询您不要使用 addlashes,而是使用 mysql_real_escape_string

示例:

<?php
  $param = mysql_real_escape_string($_GET['param']);
  $query = "SELECT f1, f2 FROM atable WHERE f3 = '$param' ";
  // these single quotes here are essential !!   ^      ^ 
  // if you leave out the quotes you **will** suffer SQL-injection.

这是转义 SQL 参数的正确方法。
或者甚至更好地将 PDO 与准备好的语句一起使用,那么您根本不必逃避。

【讨论】:

  • 在我看来,通常要避免添加斜杠... +1
  • use PDO, then you don't have to escape at all - 一种误导性陈述,除非您将 PDO 替换为 prepared statements
  • 最好使用参数化查询。使用您的解决方案,仍然存在 SQL 注入的风险(低但存在)。
  • @JMichelB,请举个例子。
【解决方案2】:

首先序列化你想要的值然后使用mysql_real_escape_string。毕竟,这就是您要放入数据库的字符串。尽量避免加斜线...

如果你当时不想有一个活跃的连接,试试这个功能:

function mysql_escape_no_conn( $input ) { 

    if( is_array( $input ) ) {
        return array_map( __METHOD__, $input ); 
    }
    if( !empty( $input ) && is_string( $input ) ) { 
        return str_replace( array( '\\', "\0", "\n", "\r", "'", '"', "\x1a" ), 
                            array( '\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z' ),
                            $input ); 
} 

return $input; 

}

【讨论】:

  • mysql_real_escape_string() 要求预先建立连接,有没有办法在连接到数据库之前使用它?我喜欢在连接到 MySQL 之前先格式化我的数据。
  • 根据您的需要编辑了我的答案,顺便说一句,我不赞成... :)
  • -1,滚动你自己的 mysql_real_escape_string 是一个的坏主意。
【解决方案3】:

使用mysql_real_escape_string函数!

【讨论】:

    【解决方案4】:

    正如其他人所说,应该调用mysql_real_escape_string()

    我只是想补充一点,我总是觉得base64_encode() 我存储在数据库中的所有序列化数组/对象都是安全的。然后,您所要做的就是在检索存储值时调用base64_decode()。我这样做是因为; 和其他字符可能会导致“警告:偏移错误...”错误。

    【讨论】:

      【解决方案5】:

      您需要使用mysql_real_escape_string() 转义$b 中的字符串。

      $a = addslashes('hello\'s');  
      $b = serialize($a);  
      $sql = "UPDATE `table` SET `field`='".mysql_real_escape_string($b)."'" ;
      

      您应该始终将输入转义到数据库中以停止 SQL 注入。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多