我将以下数据作为示例:
$a = addslashes('hello\'s');
$b = serialize($a);
// As you know, $b looks like this s:8:"hello\'s";
现在,当我向MySQL插入$ b时,数据现在看起来像这样:8:MySQL中的“hello”。 MySQL删除了\,现在我的序列化数据无效。
解决此问题的最佳方法是什么?感谢
答案 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()
。我这样做是因为;
和其他字符容易导致“警告:偏移时出错......”错误。