2011-08-23 12 views
1

でMySQLステートメントを準備する今、私がやる:それは明らかに安全ではないですのではIN()関数

$params = array(1,2,3); 
$sql = 'select * from foo where bar in (%s)'; 

$sql = sprintf($sql, 
    implode(',', $params) 
); 

$paramsはユーザーによって供給されています。 これを修正するにはどうすればよいですか?私はZendのようなフレームワークの使用を好むだろう。

+0

可能な[可変サイズの変数リストを持つMySQL Preparedステートメント](http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list) – outis

答えて

2

あなたはPDOprepared statementsを使用することができます。

プリペアドステートメントを使用すると、データをエスケープする必要がなくなります。あなたはまだそれを検証する必要があります。

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) 
);