{{tag>プログラミング関連 Javascript}} [[start]]>[[programming_start]] ====== JavaScriptのクロスサイトスクリプティング対策について(下書き) ====== クロスサイトスクリプティング(以下XSS)はJavascriptなどのWebアプリケーションの脆弱性の一つ、Webアプリケーションへの入力に対して攻撃者(*)が脆弱性のある文字列を入力する事で管理者やWebアプリケーションが想定しない行動が可能となり情報漏洩・データの書き換えや破壊・任意のスクリプトの実行など可能となる危険性があります。(*攻撃の意図が無くても脆弱性のある文字列を入力すればXSSが発生します) 外部(*)からの入力を一切受け付けないWebアプリケーションでは発生しません。(*フォーム・cookie・データファイルなど) ---- ===== 対策 ===== 基本的には外部から入力されたデータはそのまま出力せず、必ずXSS対策してから出力する事。 ==== 1.htmlページに表示する場合 ==== 外部から入力された文字列をそのままhtmlページに表示すると、htmlタグやスクリプトが使えるので危険です。 例えば対策してなければ、下記のように入力されればスクリプトが実行できます。 対策は、「<」→「<」と「>」「 >」と「&」→「&」に置換(エスケープ)する事でhtmlタグやスクリプトを無効にできます。 <script type="text/javascript">alert('xss')</script> ↓実際にhtmlで出力した場合、文字列として出力されます。 <script type="text/javascript">alert('xss')</script> (「&」は直接xssとは関係ありませんが、置換しない場合「< と <」を変換すると→「< と <」になり区別できなくなります。置換すれば→「<と &<」となり区別できます) ==== 2.htmlタグの属性値に使う場合 ==== 入力されたデータをhtmlタグの属性値(
の value の部分など)に使う場合は次の3点の注意が必要です。 === 対策1 === 属性がhrefとsrcの場合()は、入力値がhttpから始まるか確認する。(※試して無いけど「/」や「./」や「../」からでも大丈夫かも) 例えば リンク 次のデータを入力すると javascript:alert('xss') クリックするとjavascriptが実行できてしまう。 リンク httpから始まればjavascriptは実行できません。 注意:javascriptの文字をブロックしてもダメで、「j」を「J」にしたり実態参照の「j」や「j」などに置き換えても動作するし、javascript以外にVBScriptがあったり将来新しい言語が追加される可能性もあります。 === 対策2 === 「"」→「"」「'」→「'」に置換(エスケープ)する。 下記のようにデータが挿入される場合 下記のようなデータを入力すると " click="alert('xss') 次のようになり出力され、「click="alert('xss')"」が実行できる状態になります。 置換すれば下記のようになり安全です === 対策3 === 属性値は必ず「"」か「'」で括られている事 XSS以前の問題で、括ってないのはHTMLの文法エラーなのですが、括り忘れると対策2を実施しても意味がありません。 例えば、属性値を括って無い場合 次のデータを入力すると ダミー onclick=javascript:alert(`xss`) 次のようになり出力され、「onclik」でスクリプトが実行できる状態になります。(※()内はバッククォートを使っていますが「'」から変換された「'」などでも動作します) ---- [[start]]>[[programming_start]]