本記事の目的
こちらは、SE2年目である私が普段「なんとなく」で使っているIT関連のワードを勉強して、具体的な理解を深めていこう、というものです。
私と同じように「なんとなくで理解を済ませてしまっているどなたか」の一助になれば幸いです。
なんとなくの理解
「サニタイズ」とは、「なんか危ない文字列を安全にする処理」です。
少なくとも私はこれまで、こんな理解で「サニタイズ」というワードを使ってきました。
これをもう少し具体的に深堀ります。
そもそもの「サニタイズ」とは
- 英単語の一つです。
- スペルは「sanitize」です。意味は「消毒する」です。
- 上記イメージのような処理をサニタイジング(sanitizing)と呼ぶこともあるそうなので、その時の意味は「消毒(すること)」ですね。
「消毒」という単語元来の意味を知るだけで、「サニタイズ」というワードを、処理の目的と関連付けて覚えやすくなりそうです。
まさしく「プログラムにとって毒になるような文字列の毒素を取り除く処理」ですね。
具体例で見る。
PHP
PHPでサニタイズを行う場合は以下のようにhtmlspecialchars()関数を使う例が多そうです。
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
JavaScrip
JavaScriptでは、DOMPurifyライブラリのsanitize()関数を使う例が多そうです。
const clean = DOMPurify.sanitize(dirty);
以上の二つを比べてみると、なかなか面白いです。
phpのhtmlspecialchars()の関数名は、「HTMLの特殊な文字列」と読み取れます。
要するにこれは、厳密には、サニタイズを主目的とした関数ではなく、あくまで「HTMLの特殊文字(タグに使う<など)を処理する関数」ということです。
一方でJavaScriptのDOMPurifyライブラリのsanitize()関数はそのまんま「サニタイズ」です。
これらがどういうことかと言うと、htmlspecialchars()はあくまで「サニタイズの一環として」使われる関数に過ぎず、DOMPurify.sanitize()は「サニタイズのために」使われる関数だということです。
ですので、
PHPの場合は、
もっと複雑な別ケースのサニタイズ処理を想定する時、他の関数を使ったり、単に関数を使うだけじゃない独自処理を組み立てる必要があるのかもしれません。
JavaScriptの場合は、
DOMPurify.sanitize()を使えば、htmlspecialchars()より幅広いケースに対応できそうです。
実際、DOMPurify.sanitize()には例に挙げた使い方以外にも、もっと色々なオプションをつけた柔軟な使い方ができるみたいです。(DOMPurifyとある通り、DOMのみを対象にした話ではありそうですが)
今回は2つの例しか挙げませんでしたが、この辺りの関数名・ライブラリ名などの違いを意識して理解していくと、より自身の目的に沿ったサニタイズ処理を行うことができそうです。
フレームワークやライブラリの中での標準装備のサニタイズ
PHPのフレームワークである「Laravel」や、JavaScriptでのUI部分の構築を助ける「React」「Vue.js」を使用する場合、この中では「部分的に」「暗黙的に」自動的なサニタイズを行うような処理が組み込まれていたりします。
つまり、サニタイズが標準装備になっている場合があります。
こういうものが標準装備になっているおかげで、そこまで「サニタイズ」というものを理解していなくても何とかなったりしちゃうわけですが、だからと言って「サニタイズ」を理解しなくてもいい、という話ではありません。
- あくまで「部分的に」自動的なサニタイズ(ここではエスケープといった方がいいかもしれませんが)がされているだけであって、完璧な「消毒」を保証してくれるわけじゃない。
- その自動的なサニタイズ処理が、(余計なお世話的に)邪魔になる時がある。こういう時はその自動的なサニタイズを強制的に外すことになるわけですが、この際は当然、自分でサニタイズを意識しないといけません。
フレームワーク的なものは近年どんどん便利になってきているようですが、暗黙的に色々勝手にやってくれる分(便利ですけど)、こういうことを意識する機会が減ってしまうというのは、私みたいな初学者にとっては逆に危ういことなのかもしれません。
大体こんな感じでまとめることにします。
余談
- 一口にサニタイズと言っても、想定するパターンは多岐に渡ります。
- 消毒の対象はHTMLタグだけでなく、SQL文やシェルスクリプトなど、色々あるみたいですね。
- こういうセキュリティを意識した内容は「やって当然」「やらないといけない」にも関わらず、処理としてはあまり表面化しない地味なものなので、勉強するモチベーションが中々上がらなくて困りますね、、、
