職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

PreparedStatementはSQLi対策として100%安全なのか?

脇の甘い技術者というのは世の中には多く存在していて、日本に居た時もAustraliaに来てからも、SQLi (SQL Injection) 脆弱性を見つけたり治したりすることは多々ありました。
基本的にはエスケープをかけるか Prepared Statement を使うかの2択で、可能な限り後者を使います。その理由は、エスケープには未知の穴があるのではないか?という不安があるからです。Prepared Statement なら十分だろう、という思い込みというのもありました。
もちろん上記以外にも、念には念を入れて様々な対策を施していますが(流石に詳細は書けないw)。

そんな折、PostgreSQL Advent Calendar 2012 : ATND の16日目の記事で気になる表現を見かけました。

流石に最近ではプリペアードクエリさえ使っていれば安全で十分だとする乱暴な議論は聞かれなくなりましたが、

http://blog.ohgaki.net/postgresql-prepared-query-explained

非常に耳の痛い話です。
Prepared Statement が安全ではない事例の一つとして null文字 の処理を挙げられていますが、確かにその通りです。詳しくは引用元の記事に詳しく述べてありますので、ぜひご覧下さい。

他には?

null文字以外にも Prepared Statement がSQLi脆弱性を帯び得るケースがあるのでは?と思い、少し調べてみました。
その中に、こんな議論がありました。
Are prepared statements 100% safe against SQL injection? - IT Security
確かに、buffer overflow 脆弱性があれば、広義の(?) SQL Injection 攻撃は成立しそうです。

いやはや、過信はよくありませんね。
自分自身も「脇の甘い」技術者に分類されるということです。今後も精進しなければなりません。