入力の検証や表現の問題は、メタキャラクター、代替エンコーディング、数値表現などによって引き起こされます。セキュリティの問題は、入力を信頼することに起因します。この問題に含まれるのは、「Buffer Overflow」、「Cross-Site Scripting」攻撃、「SQL Injection」などです。
...
v_account = request->get_form_field( 'account' ).
v_reference = request->get_form_field( 'ref_key' ).
CONCATENATE `user = '` sy-uname `'` INTO cl_where.
IF v_account IS NOT INITIAL.
CONCATENATE cl_where ` AND account = ` v_account INTO cl_where SEPARATED BY SPACE.
ENDIF.
IF v_reference IS NOT INITIAL.
CONCATENATE cl_where "AND ref_key = `" v_reference "`" INTO cl_where.
ENDIF.
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE (cl_where).
...
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE user = sy-uname
AND account = <account>
AND ref_key = <reference>.
"abc` OR MANDT NE `+"
」を入力し、v_account に文字列「1000」を入力すると、クエリは次のようになります。
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE user = sy-uname
AND account = 1000
AND ref_key = `abc` OR MANDT NE `+`.
OR MANDT NE `+`
の条件を追加すると、クライアント フィールドがリテラル + と等しくなることはないため、WHERE
句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items.
invoice_items
テーブルに格納されているすべてのエントリを返すようになりました。
PARAMETERS: p_street TYPE string,
p_city TYPE string.
Data: v_sql TYPE string,
stmt TYPE REF TO CL_SQL_STATEMENT.
v_sql = "UPDATE EMP_TABLE SET ".
"Update employee address. Build the update statement with changed details
IF street NE p_street.
CONCATENATE v_sql "STREET = `" p_street "`".
ENDIF.
IF city NE p_city.
CONCATENATE v_sql "CITY = `" p_city "`".
ENDIF.
l_upd = stmt->execute_update( v_sql ).
"ABC` SALARY = `1000000"
」のような文字列を入力すると、アプリケーションではデータベースを変更された給与で更新できます。
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var username:String = String(params["username"]);
var itemName:String = String(params["itemName"]);
var query:String = "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName;
stmt.sqlConnection = conn;
stmt.text = query;
stmt.execute();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
が一致するアイテムだけが表示されます。
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
sda = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
sda.Fill(dt);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'); DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
例 2:または、次のコードで SQLite を使用しても類似の結果を得ることができます。
...
ctx.getAuthUserName(&userName); {
CString query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ request.Lookup("item") + "'";
dbms.ExecuteSQL(query);
...
...
sprintf (sql, "SELECT * FROM items WHERE owner='%s' AND itemname='%s'", username, request.Lookup("item"));
printf("SQL to execute is: \n\t\t %s\n", sql);
rc = sqlite3_exec(db,sql, NULL,0, &err);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'); DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
ACCEPT USER.
ACCEPT ITM.
MOVE "SELECT * FROM items WHERE owner = '" TO QUERY1.
MOVE "' AND itemname = '" TO QUERY2.
MOVE "'" TO QUERY3.
STRING
QUERY1, USER, QUERY2, ITM, QUERY3 DELIMITED BY SIZE
INTO QUERY
END-STRING.
EXEC SQL
EXECUTE IMMEDIATE :QUERY
END-EXEC.
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itm
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
の条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
<cfquery name="matchingItems" datasource="cfsnippets">
SELECT * FROM items
WHERE owner='#Form.userName#'
AND itemId=#Form.ID#
</cfquery>
...
SELECT * FROM items
WHERE owner = <userName>
AND itemId = <ID>;
Form.ID
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を Form.ID
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemId = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 hacker
を持つ攻撃者が文字列「hacker'); DELETE FROM items; --
」を Form.ID
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'hacker'
AND itemId = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'hacker'
AND itemId = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
final server = await HttpServer.bind('localhost', 18081);
server.listen((request) async {
final headers = request.headers;
final userName = headers.value('userName');
final itemName = headers.value('itemName');
final query = "SELECT * FROM items WHERE owner = '"
+ userName! + "' AND itemname = '"
+ itemName! + "'";
db.query(query);
}
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様のトリックを使用すると一般的な攻撃はできてしまいます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
rawQuery := request.URL.Query()
username := rawQuery.Get("userName")
itemName := rawQuery.Get("itemName")
query := "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName + ";"
db.Exec(query)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合にのみ、クエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様のトリックを使用すると一般的な攻撃はできてしまいます。攻撃者が文字列「name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
ResultSet rs = stmt.execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Example 1
を応用しています。
...
PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String itemName = this.getIntent().getExtras().getString("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, null);
...
...
var username = document.form.username.value;
var itemName = document.form.itemName.value;
var query = "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName + ";";
db.transaction(function (tx) {
tx.executeSql(query);
}
)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
$userName = $_SESSION['userName'];
$itemName = $_POST['itemName'];
$query = "SELECT * FROM items WHERE owner = '$userName' AND itemname = '$itemName';";
$result = mysql_query($query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
procedure get_item (
itm_cv IN OUT ItmCurTyp,
usr in varchar2,
itm in varchar2)
is
open itm_cv for ' SELECT * FROM items WHERE ' ||
'owner = '''|| usr || '''' ||
' AND itemname = ''' || itm || '''';
end get_item;
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itm
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
の条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
userName = req.field('userName')
itemName = req.field('itemName')
query = "SELECT * FROM items WHERE owner = ' " + userName +" ' AND itemname = ' " + itemName +"';"
cursor.execute(query)
result = cursor.fetchall()
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
userName = getAuthenticatedUserName()
itemName = params[:itemName]
sqlQuery = "SELECT * FROM items WHERE owner = '#{userName}' AND itemname = '#{itemName}'"
rs = conn.query(sqlQuery)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。
...
id = params[:id]
itemName = Mysql.escape_string(params[:itemName])
sqlQuery = "SELECT * FROM items WHERE id = #{userName} AND itemname = '#{itemName}'"
rs = conn.query(sqlQuery)
...
SELECT * FROM items WHERE id=<id> AND itemname = <itemName>;
itemName
内に単一引用符を指定する攻撃者から保護され、SQL Injectionの脆弱性を回避したと見なされることがお分かりでしょう。ただし、Ruby は静的に型付けされた言語ではないため、id
をある程度変化のある整数と想定していても、実際にはユーザー入力から割り当てられるため、数値であるとは限りません。攻撃者が id
の値を 1 OR id!=1--
に変更した場合、id
が実際に数値だというチェックがないため、SQL クエリは次のようになります。
SELECT * FROM items WHERE id=1 OR id!=1-- AND itemname = 'anyValue';
SELECT * FROM items WHERE id=1 OR id!=1;
id
の値が 1 かどうかに関係なくテーブルからすべてを選択しています。つまり、テーブル内のすべてと等しくなります。
def doSQLQuery(value:String) = Action.async { implicit request =>
val result: Future[Seq[User]] = db.run {
sql"select * from users where name = '#$value'".as[User]
}
...
}
SELECT * FROM users
WHERE name = <userName>
userName
に単一引用符が含まれない場合のみクエリは正しく動作します。 ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を userName
に入力すると、クエリは次のようになります。
SELECT * FROM users
WHERE name = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM users;
users
テーブルに格納されているエントリをすべて返します。owner
が一致するアイテムだけが表示されます。
...
let queryStatementString = "SELECT * FROM items WHERE owner='\(username)' AND itemname='\(item)'"
var queryStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
if sqlite3_step(queryStatement) == SQLITE_ROW {
...
}
}
...
SELECT * FROM items
WHERE owner = '<userName>'
AND itemname = '<itemName>'
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'); DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
username = Session("username")
itemName = Request.Form("itemName")
strSQL = "SELECT * FROM items WHERE owner = '"& userName &"' AND itemname = '" & itemName &"'"
objRecordSet.Open strSQL, strConnect, adOpenDynamic, adLockOptimistic, adCmdText
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
が一致するアイテムだけが表示されます。
...
string userName = ctx.getAuthenticatedUserName();
string queryString = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
SimpleQuery<Item> queryObject = new SimpleQuery(queryString);
Item[] items = (Item[])queryObject.Execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
List items = sess.createQuery(query).list();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
文字を使用して定義されます。
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName#
</select>
#
文字は、iBatis が userName
変数を使用してパラメーター化されたクエリを作成することを示します。ただし、iBatis では、$
文字を使用して変数を SQL ステートメントに直接連結することもできるため、SQL Injection のチャンスが高まります。
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName# AND itemname = '$itemName$'
</select>
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様のトリックを使用すると一般的な攻撃はできてしまいます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String sql = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
Query query = pm.newQuery(Query.SQL, sql);
query.setClass(Person.class);
List people = (List)query.execute();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
が一致するアイテムだけが表示されます。
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
var items = dataContext.ExecuteCommand<Item>(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'); DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
文字を使用して定義されます。
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
</select>
#
文字と中カッコで囲んだ部分は、MyBatis が userName
変数を使用してパラメーター化されたクエリを作成することを示します。ただし、MyBatis では、$
文字を使用して変数を SQL ステートメントに直接連結することもできるため、SQL Injection のチャンスが高まります。
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
AND itemname = ${itemName}
</select>
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、WHERE
句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様のトリックを使用すると一般的な攻撃はできてしまいます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
が一致するアイテムだけが表示されます。
...
string userName = ctx.GetAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
List items = sess.CreateSQLQuery(query).List();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
ItemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を ItemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を ItemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
が一致するアイテムだけが表示されます。
...
string userName = identity.User;
string itemName = apiGatewayProxyRequest.QueryStringParameters['item'];
string statement = $"SELECT * FROM items WHERE owner = '{userName}' AND itemname = '{itemName}'";
var executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.Statement = statement;
var executeStatementResponse = await dynamoDBClient.ExecuteStatementAsync(executeStatementRequest);
return displayResults(executeStatementResponse.Items);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。owner
が一致するアイテムだけが表示されます。
...
String userName = identity.getUser();
String itemName = apiGatewayProxyRequest.getQueryStringParameters('item');
String statement = String.format("SELECT * FROM items WHERE owner = '%s' AND itemname = '%s'", userName, itemName);
ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.setStatement(statement);
ExecuteStatementResponse executeStatementResponse = dynamoDBClient.executeStatement(executeStatementRequest);
return displayResults(executeStatementResponse.items());
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
ResultSet rs = stmt.execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価をします。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'; DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Example 1
を応用しています。
...
PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String itemName = this.getIntent().getExtras().getString("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, null);
...
mysql_real_escape_string()
などのエンコーディング関数を使用すると、ある程度は SQL Injection の脆弱性に対する攻撃を防ぐことはできますが、完全に防ぐことはできません。このようなエンコーディング関数に頼ることは、脆弱な拒否リストを使用して SQL Injection を阻止しようとするのと同じことであり、攻撃者によるステートメントの改変や任意の SQL コマンドの実行が可能となる場合があります。動的に解釈されるコードの特定のセクション内のどこに入力が現れるのかを静的に判断することは必ずしも可能ではないため、Fortify Secure Coding Rulepacks は検証された動的 SQL データを「SQL Injection: Poor Validation」の問題として提示します。これは、検証によってコンテキスト内での SQL Injection を十分に防ぐことができるとしても同様です。mysqli_real_escape_string()
の動作が変更される場合について示したものです。 SQL モードが「NO_BACKSLASH_ESCAPES」に設定されている場合、バックスラッシュ文字はエスケープ文字ではなく、通常の文字として扱われます [5]。 mysqli_real_escape_string()
はこのことを考慮するため、次のクエリは SQL Injection に対して脆弱となります。これは、データベースの設定によって "
が \"
にエスケープされなくなるためです。
mysqli_query($mysqli, 'SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
...
$userName = mysqli_real_escape_string($mysqli, $_POST['userName']);
$pass = mysqli_real_escape_string($mysqli, $_POST['pass']);
$query = 'SELECT * FROM users WHERE userName="' . $userName . '"AND pass="' . $pass. '";';
$result = mysqli_query($mysqli, $query);
...
password
フィールドを空白のままにして、userName
に対して " OR 1=1;--
と入力すると、引用符はエスケープされず、クエリの結果は次のようになります。
SELECT * FROM users
WHERE userName = ""
OR 1=1;
-- "AND pass="";
OR 1=1
によって where 句は常に真 (true) の評価を行い、二重ハイフンによってステートメントの残りの部分はコメントとして扱われるため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM users;
owner
が一致するアイテムだけが表示されます。
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
IDataReader responseReader = new InlineQuery().ExecuteReader(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
に単一引用符が含まれない場合のみクエリは正しく動作します。ユーザー名 wiley
を持つ攻撃者が文字列「name' OR 'a'='a
」を itemName
に入力すると、クエリは次のようになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
条件を追加すると、where 句は常に真 (true) の評価を行います。そのため、このクエリは次のような単純なクエリと論理的に等しくなります。
SELECT * FROM items;
items
テーブルに格納されているすべてのエントリを返すようになりました。Example 1
で構築および実行されたクエリに悪意のある別の値が渡された場合の影響を検討します。ユーザー名 wiley
を持つ攻撃者が文字列「name'); DELETE FROM items; --
」を itemName
に入力すると、クエリは次の 2 つのクエリになります。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
と同様の技法を使用すると一般的な攻撃を有効にできます。攻撃者が文字列「name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
」を入力すると、次の 3 つの有効なステートメントが作成されます。
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';