https://docs.python.org/ja/2.7/library/sqlite3.html
の中に、
「たいてい、SQL 操作では Python 変数の値を使う必要があります。この時、クエリーを Python の文字列操作を使って構築することは安全とは言えないので、すべきではありません。そのようなことをするとプログラムが SQL インジェクション攻撃に対し脆弱になります (https://xkcd.com/327/ ではどうなってしまうかをユーモラスに描いています)。」
と説明がありますが、この漫画のユーモアはおろか、意味もよく分からず困っております。
どなたか教えていただけると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/31 18:21
回答3件
0
ベストアンサー
訳したらこんな感じですよね。
1コマ目
電話「こちらはあなたの息子さんの学校です。ちょっとコンピュータのトラブルがありまして」
2コマ目
人物「あらら、彼がなにかを壊したんでしょうか?」
電話「まぁある意味で」
3コマ目
電話「あなたは本当に息子に『Robert'); DROP TABLE Students;』と名付けたんですか?」
人物「はいそうです。私らは『リトルボビーテーブルズ』と呼んでますが」(BobbyはRobertの愛称)
4コマ目
電話「そうですか。私たちは今年度の学生のレコード(行)を失いました。あなたの幸せを祈ってます」
人物「私はあなた方がデータベースへの入力のサニタイズ(無害化)を学べたことを願ってます」
3コマ目で「SQLインジェクションを起こす名前」が付けられている事が判明したあたりがユーモアなんでしょう。
投稿2019/07/31 17:24
総合スコア8949
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ユーモアはちょっと置いといて、SQL インジェクション防止のための本質的なところに目を向けてはいかがですか? それは、
ユーザー入力と文字列連結してクエリを組み立てると SQL インジェクションの問題があるので、クエリは必ずパラメータ化すべき。
・・・ということです。
漫画は、ユーザー入力を文字列連結するようなコーディングだったので、ユーザーに drop... という文字列を入力され、結果、テーブルがまるごとドロップされてしまったということです。
【追記】
下の 2019/08/01 10:10 の私のコメントで「長くなりますので回答欄に追記します」と書きましたが、それを以下に書きます。
漫画にこだわらないで、ドキュメントの本質を見ようよ。ってことですね。
質問者さんの本来の疑問は漫画の意味ではなくて、https://docs.python.org/ja/2.7/library/sqlite3.html に書いてあった「SQL インジェクション攻撃に対し脆弱」になるのは何故かで、対策として以下のようにクエリをパラメータ化するということが書いてあったが理解できない。
# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t)
漫画を読めば理解できると思ったがやっぱり理解できない・・・ということで今回の質問に至ったと勝手に理解してます。
違いますか?>質問者さん
「パラメータ化」って言葉を選んだのにもなんか理由があったりしますか? 「プリペアドステートメントを使用する」って表現が一般的な気がしますが、使い分けの理由があれば知りたいです。
自分的には「SQL インジェクション防止」⇒「クエリのパラメータ化」という言葉が出てくるということです。質問者さんが参考にされている記事にも "パラメータ割り当てを使います" とありましたし。
パラメータ化のもう一つのメリットにパフォーマンスの向上がありますが、そちらに目が行くと「プリペアドステートメント」という言葉も出てくるかもしれませんが。
#SQL Server の場合の自分的な理解ですが、クエリをパラメータ化するというのはリテラルの部分をプレースホルダを使って記述すること。パラメータの入力はリテラルとして扱われるから SQL インジェクション攻撃を防ぐことができる・・・ということで、「SQL インジェクション」と言われると「パラメータ化」という言葉しか出てきません。
パラメータ化クエリ
http://surferonwww.info/BlogEngine/post/2012/02/02/Parameterized-query.aspx
#これは質問者さんにとってはどうでもいい話かもしれませんが、もう一つ副次的な効用があって、SQL Server + SqlClient でパラメータ化クエリを使用すると、照合順序の違いによる文字化けに悩むことがなくなるというメリットもあります。
パラメータ化の副次的な効用
http://surferonwww.info/BlogEngine/post/2016/06/04/use-parameterized-query-to-avoid-unexpected-character-corruption.aspx
投稿2019/07/31 22:28
編集2019/08/01 01:26退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/31 22:35
退会済みユーザー
2019/07/31 22:39
退会済みユーザー
2019/08/01 00:42
退会済みユーザー
2019/08/01 01:10
退会済みユーザー
2019/08/01 01:44
2019/08/02 05:22
0
この漫画、理解度で笑うポイントが変わってきます。
第1段階「うわ。SQL インジェクションwww DROP かよ。エグいwww」
第2段階「複文かよ(苦笑)」
第3段階「文字連結放置かよ(冷笑)」
第4段階「(広い心で)うわ。SQL インジェクションwww DROP かよ。エグいwww」
第1段階で笑うことを想定した漫画ですが、第4段階で笑えるようになりましょう!
投稿2019/07/31 22:35
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/01 12:36
2019/08/02 05:18
退会済みユーザー
2019/08/02 09:17
2019/08/02 16:27
退会済みユーザー
2019/08/02 22:29 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。