现在我做了:
$params = array(1,2,3);
$sql = 'select * from foo where bar in (%s)';
$sql = sprintf($sql,
implode(',', $params)
);
$params
由用户提供,因此显然不安全。
我怎样才能解决这个问题?我更喜欢使用像Zend这样的框架。
答案 0 :(得分:2)
您可以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 );
通过使用预准备语句,您可以避免转义数据。你仍然需要验证它。
答案 1 :(得分:0)
您必须使每个数组条目安全。使用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)
);