1
MySQL的语句现在我做:准备在()函数
$params = array(1,2,3);
$sql = 'select * from foo where bar in (%s)';
$sql = sprintf($sql,
implode(',', $params)
);
$params
由用户提供的,因此显然是不安全的。 我该如何解决这个问题?我更喜欢使用像Zend这样的框架。
MySQL的语句现在我做:准备在()函数
$params = array(1,2,3);
$sql = 'select * from foo where bar in (%s)';
$sql = sprintf($sql,
implode(',', $params)
);
$params
由用户提供的,因此显然是不安全的。 我该如何解决这个问题?我更喜欢使用像Zend这样的框架。
你可以使用prepared statements与PDO:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$params = array(1,2,3);
$values = implode(',', array_fill(0, count($params), '?')); // ?,?,?
$sql = "select * from foo where bar in ($values)";
$stmt = $dbh->prepare($sql);
$stmt->execute($params);
通过使用预准备语句,您可以避免需要转义数据。你仍然需要验证它。
你必须使每个数组入口安全。要么使用mysql_real_escape_string()
,要么在你的情况下,只是通过强制转换为int。最通用的方法是如下:
function quoteString($string) {
return "'" . mysql_real_escape_string($string) . "'";
}
$quotedParams = array_map("quoteString", $params);
$sql = sprintf($sql,
implode(',', $quotedParams)
);
在你的情况,你可以强制转换为int,所以你可以做这样的:
$intParams = array_map("intval", $params);
$sql = sprintf($sql,
implode(',', $intParams)
);
[MySQL Prepared statement with a variable size variable list]可能的重复(http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list) – outis