2011-01-27 11 views
1

私はいつも他のサニタイズ方法(と準備された文章)を使いたいですが、クライアントが元のスクリプトから1行を変更したくない特定の条件の下にあります(プラグインを追加するだけです)mysql query + sprintf = injection?

イムは、誰かが$ POST値を変更することで、これを悪用する可能性がありますし、(クライアントが通常行うように)、彼は私を責め可能性が心配:

extract($_POST, EXTR_PREFIX_ALL, "POST"); 
$q = sprintf(ARQ, trim($POST_string)); 
$res = doexec($q); 
DEFINE("ARQ", "INSERT INTO library (string) VALUES ('%s')"); 

私はいくつかの組み合わせを試してみましたが、私は得ることができ、すべてがエラーだった、何のmysqlので を注入していませんこれは十分安全ですか?

+3

全く安全ではありません。 '%s'はデータをエスケープしません。それはちょうどそれの場所に置かれる文字列を必要とします。クエリに入れる前に、 'PDO' /' mysqli'を見て、準備された文を使うか、値に 'mysql_real_escape_string'を使う必要があります。 –

+4

あなたは[mysql_queryのドキュメントのsprintfの例](http://php.net/manual/en/function.mysql-query.php)を見たことがありますか?あなたが掲示したものよりずっと簡単で、注入安全です。 –

答えて

0

doexecは、;でチェーンされた複数のコマンドを受け入れないものを呼び出すとしますか?サブクエリを使用して、他のテーブルからパスワードやその他の機密データを挿入することもできます(ユーザーが保存したデータを読み取ることができると仮定した場合、timing attackを使用できます)。ファイルシステムのセキュリティがデータベースアクセスコードのセキュリティと同程度でない場合、SELECT INTOを使用して実行可能なPHPスクリプトを作成できます。