会員登録すると
学習することができます。
会員登録する(無料)
登録済みの方はこちら
ログイン

AIが書いたコードを読む ― 入力の行き先を追う

目安学習時間 15分

課題

全問正解でレクチャー完了です。

【問題1】

Railsで、ユーザー入力を使った検索として安全な書き方はどれですか。

[選択肢]

【問題2】

AIが書いたコードをセキュリティの観点で読むとき、最初に追うべきものはどれですか。

[選択肢]
会員登録すると
学習することができます。
会員登録する(無料)

学ぶ目的

全部を読もうとしない

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への頼み方に安全の条件を入れる

質問

まだ質問は投稿されていません。

質問投稿

ログイン後に質問の投稿ができます。