会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
全部を読もうとしない
AIは一度に数百行を書きます。全行を同じ注意で読むのは無理です。セキュリティの観点では、読む場所を絞れます。
見るのは「外から来た値が、どこへ流れ込むか」だけです。
| 外から来る値 | 流れ込むと危ない先 | 起きること |
|---|---|---|
| フォームの入力・URLのパラメータ | SQL文 | SQLインジェクション |
| 同上 | HTML | XSS |
| 同上 | シェルのコマンド | コマンド実行 |
| 同上 | ファイルのパス | 見せてはいけないファイルの読み出し |
実際に確かめた例
名前で検索するコードを、文字列を埋め込む形で書いたとします(Python の sqlite3 で確認)。
q = f"SELECT name FROM users WHERE name = '{x}'"
ここに ' OR '1'='1 を入れると、実行されるSQLはこうなります。
SELECT name FROM users WHERE name = '' OR '1'='1'
「または 1=1」は常に真なので、登録されている3人全員が返ってきました。
プレースホルダ(?)で値を渡す形に変えると、同じ入力で0件でした。入力は「名前という値」として扱われ、SQLの一部にはなりません。
db.execute("SELECT name FROM users WHERE name = ?", (x,))
Railsでも見分けられる
User.where("name = '#{params[:name]}'") # 危ない:文字列に埋め込んでいる
User.where(name: params[:name]) # 安全:値として渡している
#{ が SQL の文字列の中にあったら、立ち止まる合図です。
AIへの頼み方も変えられる
「検索機能を作って」ではなく「ユーザー入力はプレースホルダで渡して」と最初から条件に入れると、出てくるコードが変わります。それでも最後は読んで確かめます。
このレクチャーで学ぶこと
- 読む場所を「入力の行き先」に絞る
- 文字列埋め込みとプレースホルダの違い(実機確認)
- AIへの頼み方に安全の条件を入れる
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。