レッスン 2-1
SQL インジェクション
文字列を
入力を
なぜ通るのか
注文を
ここで、
値と命令が混ざる所
SQL では、
悪意が
プレースホルダが効く範囲
プレースホルダは、
IPA の
効かない範囲
プレースホルダで
一覧の
脆いコードと直したコード
ラボの
値をつなぐか、値を渡すか
def find_orders(db, name):sql = ("SELECT id, item FROM orders"" WHERE name = '" + name + "'")return db.execute(sql).fetchall()def find_orders(db, name):sql = ("SELECT id, item FROM orders"" WHERE name = ?")return db.execute(sql, (name,)).fetchall()直した方では、WHERE name = ? で
並び順は、許した候補から選ぶ
def list_orders(db, sort):sql = ("SELECT id, item FROM orders"" ORDER BY " + sort)return db.execute(sql).fetchall()ORDER = {"new": "created_at DESC","old": "created_at ASC"} def list_orders(db, sort):by = ORDER.get(sort, ORDER["new"])sql = ("SELECT id, item FROM orders"" ORDER BY " + by)return db.execute(sql).fetchall()直した
ログでの見え方と検知
脆い
sqlite3.OperationalError:near "Brien": syntax errorこの
| 見る物 | な |
|---|---|
| SQL の | ふだんの |
| エラーと | どの |
| 画面に | データベースの |
IPA は、
直し方と、直ったことの確かめ方
自分の
- 作業用の
フォルダに、 注文の 表を 1 つ 持つ sqlite3 の データベースを 作り、 「O'Brien」の 注文を 1 件入れておく - 脆い
find_ordersに「O'Brien」を 渡し、 構文エラーに なる ことを 記録で 確かめる - 関数を
直した コードに 置き換える - 同じ
「O'Brien」を 渡し、 エラーに ならず、 その 人の 注文 1 件だけが 返る ことを 確かめる - 下の
試験を 足し、 直す前の コードに 戻すと 試験が 落ちる ことも 確かめる - 終わったら、
作業用の フォルダごと消す
def test_quote_in_name(db):rows = find_orders(db, "O'Brien")assert rows == [(3, "紅茶")] def test_unknown_sort_uses_default(db):assert (list_orders(db, "zzz")== list_orders(db, "new"))試験は
あわせて、
関わる事例
ファイル転送の
CISA と
確認クイズ
1 問目
一覧の
- ア 列の
名前を プレースホルダで渡す - イ 列の
名前の 候補を コードに 書き、 利用者には 候補の 鍵だけを 選ばせる - ウ 列の
名前から 引用符を 取り除いてからつなぐ
答えと理由を見る
答え イ
プレースホルダで
2 問目
ふだんは
- ア データベースの
容量が 足りない - イ
その 画面の 入力が、 文の 形を 変えている - ウ 利用者の
回線が遅い
答えと理由を見る
答え イ
構文エラーは、
説明課題
次の
- な
ぜ 表や 列の 名前は プレースホルダで 縛れないのか
模範解答を見る
プレースホルダは、
一次資料
どれも
- 安全な
ウェブサイトの 。作り方 1.1 SQLインジェクション (IPA、 日本語) プレースホルダに よる 根本的な 解決、 エラーの 文を 画面に 出さない こと、 データベースの 権限を 絞ること - SQL Injection Prevention Cheat Sheet (OWASP、英語)。
表や 列の 名前、 並び順は 値として 渡せず、 許した 候補から 選ぶこと - Secure by Design Alert Eliminating SQL Injection Vulnerabilities in Software (CISA、英語)。
2024年3月25日の CISA と FBI の文書 - AA23-158A CL0P Ransomware Gang Exploits CVE-2023-34362 MOVEit Vulnerability (CISA、英語)。
MOVEit Transfer の SQL インジェクションの悪用
次へ
次の