奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

脆弱性対策は「必要最小限」に

筆者は、以下の記事の評価について「微妙なスタンス」なのですが。
「どうしてダメなのか分からない」という質問を頂きましたので、
それに答えてみたいと思います。

なぜPHPアプリにセキュリティホールが多いのか? 第42回 PostgreSQL 9.0に見るSQLインジェクション対策

関連記事
togetterでのまとめ記事その1
togetterでのまとめ記事その2

まず、上記の記事の対策内容が「間違っている」とは特に思いません。
じゃあ、どの辺が「微妙」なのか。
最も違和感を感じたのは、まとめ記事の方でちょくちょく出てくる「多重」って言葉です。
まとめ記事その1の中の以下の発言に、筆者は完全に同意します。

@ikepyon 多重防御ってさ、もし、一つがだめだった場合に他のもので防御しようと言う奴だよね。そもそも、一つで必要十分な対策で別の方法で対策する必要ってあるの?
筆者の基本的な考え方は、
「単純で簡単で必要最小限が最も良い」でして。
ソースコードの量しかり、
セキュリティ対策しかり、
プログラムの内容しかり。
勿論、実際にはそんなに簡単で単純ではないのですが、
でも「単純で簡単であるに"越したことはない"」と思います。
プログラムのバグって、処理を「書けば書くほど」、発生する確率が高くなるじゃないですか。
極端な話、1行も書かなければ、バグは発生しません。
だから、「多重」防御は「必要なら行う、必要ないなら行わない」でよろしいのではないかと。

「エスケープかプリペアドステートメントのどちらが良いか」については、
筆者は「対策が"きっちり"出来ればどちらでも良い」というスタンスです。
ただ、「多重」の考えに否定的な方は、
プリペアドステートメントを選択している印象があるので、
「現時点では」プリペアドステートメントの方が良いかなといった感じです。
で、プリペアドステートメントで不十分であれば、
まとめ記事内に書かれている「ホワイトリストでのチェックなど」を追加で良いと思います。

ああ、ただ、SQLインジェクションが何故発生するのかと、
それを防ぐ為の原理を知る為に、
「エスケープ」についての理解は必要だとは思います。
でも、「頑張って覚えたい!」と思っている初心者に対して、
すぐに「原理」を理解せよというのも、それはちょっとハードルが高い気がするのですが。
まずは、習うより慣れろとでもいうか、
対策方法から学んでいけば良いのではないでしょうか。
なので、まずは「目の前に存在している脆弱性を無くす」。

ああ、あと、本記事中に「完全に撲滅」という言葉があって、
使わない方が良いという理由が分からないって話もありました。
これは、完全に筆者の「予想」ですが、
「完全じゃない撲滅」って存在しないと思うので、
撲滅の前に完全って言葉を付けると、意味が「二重」になり、
撲滅って言葉を使っている意味が失くなるからだと思います。
例えば、以下の文章はどっちも同じ意味になると思うのですが。

1.SQLインジェクションを撲滅しましょう。
2.SQLインジェクションを完全に撲滅しましょう。

SQLインジェクションとは全然関係ありませんが、
これも「多重(二重)」ですね。

ついでに、筆者がお薦めする、セキュリティ対策を学ぶ順序を最後に書いてみたいと思います。
まあ、筆者自身も勉強中なので、少ししか分かりませんが。

1.がる先生のセキュリティ講座

これは、対策内容に関しては「もう古い」のですが、
セキュリティというモノについての「考え方」について、
「分かりやすく」解説されていると思います。

2.「安全なウェブサイトの作り方」 + 「安全なSQLの呼び出し方」

記事が新しい事もあって、上記よりも対策内容はしっかりしていると思います。
ただ、内容が難しくなった事もあって若干読み辛くなっているのでココ。

3.体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

良い書籍なのですがっていうか、「とっても」良い書籍なのですが、
内容が「濃くて深い」ので、全くの初心者には厳しいと思ったのでココ。

これら以外のWebページや書籍は、「現時点では」良く分かりません。
まあ、こんな所でしょうか。