「サニタイジング、それはセキュリティ対策として非常に重要なもの...やらねば、やられる...」
と、重めの雰囲気で始めてみましたが(笑)、外向けのWebサービスを作ったりする際にサニタイジングをしておかないとセキュリティ上のリスクが高まります。
そこで、今回はセキュリティと深く関りがあるサニタイジングに関して解説します!
サニタイジングとは?
先ずサニタイジングを一言で表現すると、
「システムへの悪意ある入力を無効化する」
です!
英語だと「sanitizing」となり、「消毒や衛生的にすること」のようですので、やはりキレイにする行為のことですね。
例えばHTMLで使われるタグは、「<p>」のように「<」「>」で囲みますが、この部分をそれぞれ「<」「>」に変換したりします。
コンピュータの中では「<」も「<」も同じ文字として扱えます。
このように文字を元の表記と同じ意味を持つが、別の表記に置き換える処理のことを「エスケープ処理」と呼びます。
では、一旦このサニタイジングの処理びイメージを持ったまま、なぜサニタイジングが必要なのかに迫っていきます。
悪意ある入力とは?
「悪意ある入力」とは、Webサイトやアプリケーションの入力画面に特殊なコードを入れて、システムを壊したり、秘密の情報を抜き出したりと悪いことをしてしまうことです。
具体的には、掲示板や利用者登録画面、問い合わせページなど、利用者がWebサイトなどに情報を入力できる箇所に、不正なコードを入力して、サーバ側に情報を送ることで攻撃できてしまいます。
「SQLインジェクション」や「クロスサイトスクリプティング」といった攻撃があります。
それぞれ簡単な例を挙げて説明します。
SQLインジェクション
SQLはデータベースを操作するための言語で、データベースの中身を取得したり、登録したりする時に使います。
Webサイトに情報を入力した際に不正なSQL文を注入(インジェクション)して、情報を抜き出したり、おかしなデータを登録したりすることを「SLQインジェクション」と呼びます。
下の図ですと、Webサイトの入力欄に「SELECT ID FROM USER;」と入力することで、データベースに登録してある、ユーザーID(ユーザー名)を全て取得する、という命令を与えることができてしまいます。
その結果、データベースはユーザー名を全て画面に表示してしまいます。これは問題ですね。
クロスサイトスクリプティング
「クロスサイトスクリプティング」は掲示板などのWebサイトに存在する欠陥を悪用して、攻撃者が用意した悪意のあるスクリプトを掲示板にリンクなどの形で埋め込む攻撃手法です。
そのリンクをクリックした利用者は意図せずスクリプトが実行されてしまい、Cookieなどのユーザー情報が悪意ある攻撃者へ送られてしまいます。
情報漏洩に繋がってしまうので、これも問題ですね。
サニタイジングの必要性と仕組み
では、改めてサニタイジングの必要性と仕組みを解説します。
前述のSQLインジェクションやクロスサイトスクリプティングなど、悪意ある入力によってプログラムに影響を与えてしまう攻撃を防ぐ必要があります。
その対策として、入力された文字をサニタイジングによって、別の文字に変換することで、その後の処理(DB操作やスクリプト処理)への影響を無くします。
例えば、SQLインジェクションや悪意あるスクリプトが入力されたときは、入力画面でバリデーションチェックと呼ばれる、入力チェックや書式チェックを行います。これは、入力文字を制限する(=や;などを入力させない)ことができます。 SQL文をエスケープ処理で別の文字に変換したりして、無害化します。
このようにサニタイジングをプログラムの中に施すことで、攻撃を「無害化」することができますね。
実際にサニタイジングを行うためにはプログラム上で変換処理を入れたり、サニタイジング用の関数(PHPの場合はhtmlspecialchars関数)を使ったりすることで、悪意ある入力を無害化することができます。
またサニタイジング以外にもSQLインジェクション対策としては「プレースホルダの実装」と呼ばれる対策もできたりしますね。
まとめ
今回はサニタイジングに関して解説してきました!
サニタイジングをしっかりやっておらず、大事なデータを抜き取られてからでは遅いので、システムを作った際にはサニタイジングが入っているか要チェックですね。
以上です!