-1

重複の可能性:
MySQLインジェクション-SELECTクエリを使用して更新/削除

だから私は私のサイトでSQLインジェクションを実行できるバグが http://mysite.com/script.php?id=1 union select 1,2,31に等しいIdプロパティを持つすべてのフィールドに1,2,3の追加の行を1つ出力することを発見しました。バグを閉じるには、ユーザー入力を検証する必要があることを知っています。

しかし、私の質問はまったく別のものです。更新クエリや挿入クエリを実行することはできますか?--を使用してクエリにコメントを付けることはできますが、で区切られた複数のステートメントを使用することはできません;。したがって、私の場合、更新クエリを実行することは可能ですか。必要に応じて、PHPコードとSQ​​Lクエリを表示できます。

$sql    = "SELECT id, title, text from table where cId=$val";
$result = mysql_query($sql);
$array  = mysql_fetch_array($result);
//echo rows in table
4

3 に答える 3

3

MySQLインジェクションから判断する-SELECTクエリを使用して、保護 しているすべてのものを更新/削除します。これはmysql_queryの制限です。私はこれに依存しません、そして特にそれが時間の経過とともにこのように残るということではありません。デフォルトで無効になっている機能に依存しないでください。たぶん、次のバージョンでは、などのステートメントがすでに許可されています。

SELECT id, title, text from table where cId=1; DROP table table
于 2013-01-01T18:59:21.097 に答える
0

いいえ、それは不可能です。ほとんどの場合、 mysql_queryを実行しているため、1回のパスで複数のクエリを実行することはできません。したがって、クエリがSELECTで始まる場合(そのように)、UPDATEインジェクションは許可されません。

編集: それでも入力にmysql_real_escape_stringを使用する

于 2013-01-01T18:45:39.847 に答える
0

デフォルトでは、これは不可能です。mysql_queryMySQL 5.0以降、1つの文字列で複数のステートメントを実行するためのオプションがありますが、これはで設定する必要がありますmysql_set_server_option

次のようにステートメントコマンドを変更して使用することを検討してくださいmysql_real_escape_string

$q = mysql_fetch_array(mysql_query("SELECT id, title, text from table where cId = " . mysql_real_escape_string($val)));

すべてのmysql_*関数は正式に非推奨になっているため、せいぜいPDOを使用するようにコードを変更します。

于 2013-01-01T18:54:28.227 に答える