どーも!
たかぽんです!
今回はプログラムを書いていく際によく聞く”エスケープ”と、”サニタイズ”について調べてみようと思います!
先日会社の勉強会で話題になったので、ちょっと自分でも深掘りしておこうと...!
エスケープって?
さて、それではまずはエスケープについて確認をしておこうと思います。
単純な英語としての意味は...
逃げる、逃亡する、脱出する、(…へ)逃げる、逃れる、(危険・災難などから)逃れる、免れる、漏れ(出)る、はみ出ている
weblio - escape
といった具合です。
では、特にIT分野に絞った場合のエスケープについても調べておきます。
エスケープ処理とは、マークアップ言語やプログラミング言語、スクリプト言語等で文字列を扱う際に、その言語にとって特別な意味を持つ文字や記号を、別の文字列に置き換えること
F5 GLOSSARY
エスケープ処理とは、プログラミング言語やソフトウェアで文字列を扱う際に、特定の記号文字などに続けて記された文字(の並び)に、その文字本来の意味とは異なる特別な意味や機能を与えること
IT 用語辞典 エスケープ処理【escape processing】
さて、ざっくり調べると他のサイト等では上記のように説明されていました。
ようは、普通プログラム等で特別な意味をもつような文字を別の形で使いたい場合などに、あえて他の文字で表したりすることをエスケープと呼んだりします。
例えば、最も身近な"<>"といったタグ文字はHTMLではタグの開始と終わりを表しますよね。
<div><hello>! World!</div>
例えばdiv要素で、"<hello>! World!"と表示したい場合はどうでしょうか?
helloを囲っているかっこもそのまま出したい...!という場合、じっさいに上記ままで試してみると...?
画像では画面上の表示は" ! World!"となってしまいました。
コードをみると<hello>というタグとして認識されています。
つまり、HTMLでは"<>"はタグだと認識されてしまうわけです。
そこで、こういうルールを作るわけです。
もしHTML上でタグをそのまま出したい場合は、"<" = "<", ">" = ">"といった形で、表示すればタグとして処理せず、文字列として処理しよう!
<div><hello>! World!</div>
ルールを決めたことによって、特殊な意味を持つ文字を特殊な使い方をするのではなく、通常の文字表示として扱うことができたわけですね!
ちなみに、ある一つの文字に対して別の表現があったりもします。
例えば、下記のHTMLは先ほどの"<, >"を使用したものと全く同じ出力になります。
<div><hello>! World!</div>
今回のHTMLに関してのエスケープの例は下記サイトが一覧でわかりやすかったので、ぜひ色々試してみてください!
また、今回は”特殊な意味を持つゆえに表示できない文字を出す”という目的のためにエスケープをつかいましたが、セキュリティ的に使用するケースもあります。
例えば下記の記事はLaravelというPHPのフレームワークから値を渡す際に上記のエスケープをしなければ、JSが実行されてしまう例...を試しています。
端的にお伝えしておくと、<script>タグを含んだ変数などをフロント側でそのまま表示してしまうと、もちろんタグとして認識されるので、そのスクリプトが実行されてしまいます。しかし、エスケープをしておけばただ"<script>"といった文字が表示されるだけで済むんですね。
では、筆者なりに簡単にまとめておきます。
エスケープは、特殊な意味合いを持つ文字をその本来の意味とは別の形で利用したい場合や、その本来の意味で使用すると危ない場合に別の文字に置き換えること。
サニタイズって?
さて、今度はサニタイズについても調べておきます。
(…を)(消毒・清掃などによって)衛生的にする
Weblio - サニタイズ
単純な意味としては消毒や清掃で衛生的にする...と。
実は筆者は先のエスケープは聞いたことあったんですが、サニタイズ...という言葉はあまり知りませんでした...
サニタイジングとは、テキストデータ上の「&」や「>」など特殊文字を一般的な文字列に変換する処理のことである。サニタイジング(sanitizing)はもともと「消毒する」「無害化する」などの意味を持つ英語である。
Weblio辞書 - サニタイジング
サニタイズは主にWeb上で行う処理のことで、サイバー攻撃につながるような文字を無効化することを指します。
promapedia - サニタイズ
特別な意味を持つ文字の特別さを無効化して、意図していたのと違う動きをしないようにする処理のこと
わわわIT用語辞典 - サニタイズ
ふむ...一番最初の定義なんかはほぼエスケープと同じにみえますね...
ほかも大体一緒な気はするんですが...
サニタイズとは、サイバー攻撃や意図しない動作をエスケープすることで無効化すること...と言い換えることもできるかもしれません。(まさに先ほどのXSSの対策はサニタイジングと言えるかも?しれません)
ただ、色々調べていったんですが...
”サニタイズ”という語は使わなくて良い
というのが筆者の結論になりました。
次節からはそれについてお伝えしていきますね。
サニタイジングは使わない方が良い?
さて、なぜそういった結論に至ったか...なんですが、そもそも”サニタイジング”という言葉は定義が曖昧で、捉える人、発言する人によって大きくニュアンスが変わってくるようです。
実際、色々とそれっぽい定義を書いてあるところはあったんですが...
上記の記事なんかをみていると、サニタイズは入力値の検証やエスケープを含んだ範囲で捉えられる場合もあり、例えばAさんがサニタイズ処理お願いしますーといったら、Bさんはエスケープしておけばいいんだな!と思ったんだけど、入力値の検証漏れてる...みたいな意思疎通のエラーが起きそうです。
ゆえに、サニタイズをしてではなく、より小さく分割して、ここの変数をエスケープして、入力値の検証もお願いしますーといった形に書き換えたりする方が良さそうです。
確実にサニタイズに対する認識が合致した人同士であれば、使っても弊害はないでしょうが、現状、定義が曖昧で一般的に一意に定義ができないので...
なので、逆にサニタイズして欲しいと言われたらこういうことであっていますか?と確認を入れる...といったこともしてみても良いかも?しれません。
まとめ
今回はエスケープとサニタイズについて考えてみました...!
こういった用語の認識の違いで人によって伝わる伝わらないとかも出てくるんですね...
割とできる人は横文字多用する印象があるんですが、脳死で覚えたからといって使うのも考えものだなぁ...と。
意見を伝える時とかも、これでもか!っていうくらい誤解されないような言葉選びを意識しようと思いました。
(あんまりやりすぎるとそれはそれであの人とはコミュニケーション取りたくない...とか思われるかもですが...いい塩梅大切...)