隣の同僚がSQLインジェクションを理解しているかどうか一発でわかる4コマ漫画


海外の [xkcd](https://xkcd.com/) というサイトにこんな4コマ漫画が掲載されています。

https://xkcd.com/327/

![exploits_of_a_mom.png](https://qiita-image-store.s3.amazonaws.com/0/7465/fbceb11a-adf2-a583-7c6a-1cdb5be53161.png "exploits_of_a_mom.png")

英語ですが、じっくり読んでみてください。
きっと「あー、なるほど（苦笑）」と思うはずです。

えっ、わからない？？
じゃあ、日本語訳を載せましょう。

1. もしもし、小学校の者ですが。今ちょっとコンピュータのトラブルが起きてまして。
2. あら大変、うちの息子が何か壊しましたか？ / まあ、そんな感じですが・・・。
3. お母さん、あなたは本当に息子さんに "Robert'); DROP TABLE Students; --" という名前を付けたんですか？ / ええ、そうですよ。みんな「ボビーテーブルちゃん」って呼んでます。
4. とりあえず、こちらでは今年度の生徒データが全部消失しました。してやったりですかね、お母さん。 / で、あなた方はデータベース用の入力値をサニタイズすることを学んでくれたかしら。

はい、もう理解しましたよね？

- 理解できた人 => 今度は隣の同僚にこの4コマ漫画を見せて、どんな反応を示すか確かめてみてください！
- 理解できなかった人 => 書籍等でDBアプリケーションのセキュリティ対策をしっかり学習しましょう！

**2016.2.16追記**
第3の選択肢として「このマンガの内容は技術的に間違っている！と思った人」を追加します。
そう思った人はかなりの上級者ですね。
たしかに技術的にツッコミたくなる部分もあると思います。

**2016.2.16追記・その2**
後述のオススメ書籍の著者でもある徳丸さん（@ockeghem）とTwitter上で興味深いやりとりをしました。
漫画の中に出てくる **サニタイズ（SANITIZE）** という用語はいろいろと誤解を招く原因になるようです。

以下にやりとした内容を転載します。

> （徳丸）拙書をご紹介いただきどうも。でも、OWASPのプレゼンテーション資料（ [OWASP_Top_Ten_Proactive_Controls_v2.pptx](https://www.owasp.org/images/3/33/OWASP_Top_Ten_Proactive_Controls_v2.pptx) ）ではこの漫画が否定されていますよ 

![image](https://qiita-image-store.s3.amazonaws.com/0/7465/3465cfc8-26b9-6922-0614-b74591a45596.png)

> （僕）コメントありがとうございます！スライドを見ましたが、漫画の否定っていうのは、DROP TABLEじゃなくて空の値を全件にUpdateするようにすれば簡単にデータを破壊できる、っていう点ですか？バインドパラメータを使うのは否定じゃなくて「対策」ですよね？

> （徳丸）最後の AND I HOPE YOU'VE LEARNED TO SANITIZE YOUR DATABASE INPUTS. に対するツッコミだと思います。 **メールアドレスとしてバリッドな文字列でも攻撃できるので、サニタイズでは対策できないよ** 、と

> （僕）うーん、それはサニタイズではなくバリデーションの話なのでは？ `'--@owasp.org` でも `email='''--@owasp.org'` とサニタイズすればデータ破壊は起きない気がします。もちろんパラメータ化が最善、というのは僕も同意しますが。

> （徳丸）サニタイズという用語は非常に曖昧ですが、 **バリデーションと同意** に使われることもあり、狭義にはエスケープではなく **「危険文字」の除去、あるいは「安全文字」への置換** という意味で用いられます

> （僕）むむむ。用語の定義はなかなかややこしいですね。そういう解釈があるとは知りませんでした。"sanitize validate escape" でググるといろんな記事が出てきますね。用語の定義が共有できていないと議論がかみ合わなくなる危険性を感じました。

> （徳丸）そうなんです。 海外の文献だと、 **ValidateとSanitizeはほとんど同じ意味** で使われます。https://cwe.mitre.org/data/definitions/20.html の Terminology Notes をお読みいただければと。

>> **Terminology Notes**
>> The "input validation" term is extremely common, but it is used in many different ways. In some cases its usage can obscure the real underlying weakness or otherwise hide chaining and composite relationships.
>>
>> Some people use "input validation" as a general term that covers many different neutralization techniques for ensuring that input is appropriate, such as filtering, canonicalization, and escaping. Others use the term in a more narrow context to simply mean "checking if an input conforms to expectations without changing it."

> （徳丸）なので、OWASPのプレゼン資料も、無理やりなツッコミという印象もあります。そこを突っ込むなよというのは、私も思います…ただ、sanitizeという言葉をできるだけ使わないほうがよいということはあります

オリジナルのやりとりを確認する場合はこちらからどうぞ。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">拙書をご紹介いただきどうも。でも、OWASPのプレゼンテーション資料ではこの漫画が否定されていますよ <a href="https://t.co/tK1GKlydvo">https://t.co/tK1GKlydvo</a> / “隣の同僚がSQLインジェクションを理解しているかどうか一発でわかる4コマ…” <a href="https://t.co/3BgJhuepGQ">https://t.co/3BgJhuepGQ</a></p>&mdash; 徳丸 浩 (@ockeghem) <a href="https://twitter.com/ockeghem/status/699231473887391745">February 15, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

徳丸さん、有益な情報をありがとうございました！
そんな徳丸さんが執筆されたセキュリティ対策の本がこちらになります↓（ステマではない）

オススメ書籍：[体系的に学ぶ 安全なWebアプリケーションの作り方<br>![b89eabaa402203fba056c1be854d0aeb1.jpg](https://qiita-image-store.s3.amazonaws.com/0/7465/e7dff351-fb12-6668-60f7-bcd115401801.jpeg)](http://amzn.to/211uccH)