サニタイジングとは
サニタイジングは、掲示板やSNSなどの入力フォームの内容をチェックして、含まれる有害な文字・文字列を検知し、無害化することです。有害な文字・文字列としてはHTMLタグやjavascript、SQLコードなどがあります。元々の英語としては「sanitizing=消毒、衛生的にすること」を意味します。
無害化する手段はいくつかあります。そのうち代表的なのが、文字・文字列を元の表記と同じ意味を持つ別の表記に置き換えるエスケープ処理です。エスケープによる対処が難しい場合は、対象のプログラムを削除することもあります。
たとえば、HTMLタグ<br>の「<」「>」の部分をそれぞれ「<」「>」にエスケープすると、「<br>」となります。こうすることで、受け取ったデータがWebアプリケーションにとって意味を持つ<br>であっても、特別な意味を持たない単なる文字列として取り扱えるようになります。
サニタイジングの必要性
サニタイジングはXSS(クロスサイトスクリプティング)対策として有効です。XSSはサイバー攻撃の1つで、Webサイト上の入力フォームに不正なプログラムを仕掛けることで成立します。
XSSの脅威の例としては以下のものがあります。
- ■セッションハイジャック
- ■個人情報の不正取得
- ■フィッシング詐欺
たとえば、攻撃者はSNSや掲示板などの動的サイトに悪意あるプログラムを仕掛け、ユーザーを偽サイトに誘導することが可能です。そこでユーザーにログインID・パスワードなどを入力させ、不正に取得できます。
しかし、サニタイジングをすれば攻撃者によって仕掛けられたプログラムを無害な文字・文字列に置き換えられ、被害を防げます。
サニタイジングの実施方法
サニタイジングはHTML生成時のタイミングで実施します。その方法を3つ見ていきましょう。
JavaScriptでオリジナルの関数を使う
JavaScriptにはサニタイジング用の関数はありません。しかし、独自に文字列を置換する関数を定義してサニタイジングを実施することは可能です。
以下に例を示します。
function htmlentities(str){
return String(str).replace(/&/g,"&")
.replace(/</g,"<")
.replace(/>/g,">")
.replace(/"/g,""")
}
replace(/〇/g,"◆")は、「〇を◆に置き換える」ことを意味します。
上記の関数 htmlentitiesにより「&→&」「<→<」「>→>」「&"→"」という置き換えが行われます。この置換により、入力文字列strをHTMLとしては意味のない文字・文字列に変換します。
PHPでhtmlspecialchars関数を使う
PHPには、あらかじめサニタイジングに使えるhtmlspecialchars関数が用意されています。
htmlspecialchars($str, ENT_QUOTES, ‘UTF-8′);
これを利用するだけでサニタイジングが実現します。そのため、前述したJavaScriptとは違い、独自に置換関数を定義する必要はありません。
ちなみに、上記の関数における引数はそれぞれ以下の役割を果たします。
- $str
- この部分に入力された文字列を設定します。
- ENT_QUOTES
- サニタイジングのルールで、基本的には「ENT_QUOTES」が使われます。これは「<」や「>」「'」「"」を置換するルールです。
- ‘UTF-8′
- サニタイジングされた文字列の文字コードを指定します。
SQLでプリペアードステートメントを行う
SQLではプリペアードステートメントを利用することでサニタイジングを実施できます。プリペアードステートメントは、「SQL実行前にSQL文をコンパイルしておき、実行時にパラメータ変数に値を当てはめる」ような動作をします。
例を1つ見てみましょう。
$stmt = $dbh->prepare('SELECT * FROM users WHERE name = :name');
プリペアードステートメントでは上記のようにprepare()を使います。括弧の中にSQL文を入れると、それがあらかじめ準備(プリペアー)された文章となります。
しかし、この時点ではまだ括弧内のSQL文は完成していません。末尾に「:name」とありますが、これは具体的なデータではなく仮の固定値だからです。実行時に、この部分に具体的なデータが入ることで、初めてSQL文が完成します。
この仕組みを利用すれば、想定しないSQL文が実行され、データベースを不正操作されることを防止できます。
サニタイジングをしてセキュリティを向上させよう!
サニタイジングとは、SNSや掲示板の入力フォームの内容をチェックして、含まれる有害文字・文字列を検知し、無害化することです。その方法として、特定の文字・文字列を別のものに置き換えるエスケープが使われます。
サニタイジングにより、有害な文字・文字列としてはHTMLタグやjavascript、SQLコードを実行してしまうリスクを回避できます。
適切にサニタイジングを行い、セキュリティレベルを高めましょう。