2011-06-23 5 views
-2

簡単な質問:ユーザーがフィールドで "union select"を入力し、それをクエリのパラメータとして送信すると、mysqlはエラーを出さないように。mysql "union select"注入からの保護方法

"union select"が入力されているか、mysqlエラーが発生する可能性のある他のキーワードがあるかどうかを確認してください。

ここで私は今使用してSQL保護機能です:どちらか一方

where column1 like '%$user_input%' 
+0

は、それがパラメータ化クエリのですか? – Randy

+1

なぜ 'mysql_real_escape_string()'だけではないのですか?あなたの 'str_replace()'はmysql_real_escape_string()によって行われた何かを元に戻す危険があります。 – Wiseguy

+1

独自の 'SQL protect'関数を作成しないでください。 mysql_real_escape_stringは正常です。あなたはどのようにあなたのセレクトをしますか?ユーザーの文字列は常に ''になっていますので、組合選択は問題ありません。SELECT * FROM table WHERE field = 'a union select x'' – Konerak

答えて

4

あなたは二つのこと

が必要PDO、不要にチェックを使用します。クエリはそれで何か似てい

function sql_protect(&$n){ 
    $n=stripslashes($n); 
    $n=mysql_real_escape_string($n); 
    $dntwant = array("\'","\\", "/","\"",")","(","<",">","\\r\\n",";","*","%"); 
    $n = str_replace($dntwant,"", $n); 
} 

PDOはすべてを行います。

または使用:

$var = mysql_real_escape_string($_POST['var']); 
$query = "SELECT * FROM test WHERE var = '$var' "; 
//          ^^These single quotes are vital!! 

これは、あなたが、やるにstripslashes、およびstr_replaceを忘れるために必要なすべてのです。あなたが動的なデータベース/テーブル/カラム名を使用したい、またはあなたがlimit句の番号を挿入したい場合は、可能

mysql_real_escape_stringのが動作しません警告しました。どちらもPDOにはなりません。
事前に承認されたホワイトリストに対して入力しようとしている入力を確認する以外は機能しません。

それを行う方法については、この質問を参照してください:How to prevent SQL injection with dynamic tablenames?

+0

LIKEステートメントで一重引用符を使うにはどうすればいいですか? – Cristy

+0

'$ query =" SELECT * FROM test WHERE var LIKE '$ var' "; ' – Konerak

+1

LIKE'%$ var% 'は動作するはずですか? – Cristy

0

は、クエリを準備し、実行してみてください:

$stmt = $db->prepare("SELECT * FROM test WHERE column1 LIKE ?"); 
$stmt->execute(array("%{$user_input}%")); 
関連する問題