转义并将序列化数据插入MySQL

时间:2011-08-11 15:24:57

标签: php mysql

我将以下数据作为示例:

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

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

现在,当我向MySQL插入$ b时,数据现在看起来像这样:8:MySQL中的“hello”。 MySQL删除了\,现在我的序列化数据无效。

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

5 个答案:

答案 0 :(得分:6)

要转义参数以进入SQL查询,您不使用addslashes,但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 :(得分: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; 

}

答案 2 :(得分:0)

使用mysql_real_escape_string函数!

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

正如其他人所说,mysql_real_escape_string()应该被召唤!

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