プログラミング PHP

XSS対策の基本は入力値制限とサニタイジング(無害化)の2つ

投稿日:

XSS(クロスサイトスクリプティング)の基本的な対策は何をすればいいのかがぼんやりしている方向けの書いています。

対策方法はタイトルの通り、XSS(クロスサイトスクリプティング)対策の基本は入力値制限とサニタイジング(スクリプトの無害化)です。

入力値制限

POST/GET送信する入力フィールドの値を制限することで、スクリプト入力ができないようにする対策です。
・数値のみ
・文字数制限
・記号の不許可
によって制限することができます。

サニタイジング(スクリプトの無害化)

画面への表示時にスクリプトが埋め込まれている場合に、タグ等をエスケープして文字列として扱うことで、スクリプトが実行されないようにする対策です。
これは、htmlspecialchars関数で実装します。
例)

入力値制限されているのに、なぜスクリプトが埋め込まれる可能性があるのか?
それは、すべての入力フィールドで上記すべての入力値制限を設定できないケースでは入り込む余地があります。
例えば、ブログ記事の本文は数値と記号も入りますし、文字数が数文字程度に制限はできません。

ではすべての項目にhtmlspecialchars関数を設定しないといけないのかというとそうでもないです。
htmlspecialcharsは文字数が多いため、ラッパー関数として以下のようにすることが一般的です。
※ラッパーとはラップ(包み込む)の人称形です。

Laravel(PHPフレームワーク)では、{{}}と変数を囲むだけでエスケープ処理されます。

まとめ

・入力値制限でスクリプトが入力される可能性を排除する。
・htmlspecialchars関数でスクリプトの実行を無害化できる。
・htmlspecialchars関数はラッパー関数にして使用することが一般的である。
・Laravelフレームワークでは{{}}でエスケープ可能である。

-プログラミング, PHP
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

MySQL-タイムゾーン設定すると起動しなくなる原因と対処方法

MySQLのタイムゾーン設定をすると、XAMPPでMySQLが起動できなる原因と対処法です。   原因 原因は、MySQL(MariaDB)は最初から日本語設定が入ってないためです。 def …

Redmineでリンクにできない場合にチェックすること

リンクにできない場合のチェック項目 前後に文字列がくっついている。 前後に全角スペースがある。 リンクの#が全角になっている。   リンクにするには? 以下のルールで記述すればリンクにできま …

AbstractFactoryパターンをenumで生成するメリット

AbstractFactoryパターンの説明には、実行時引数に文字列を渡したり、フラグでif-else判定する例をよく見かける。 しかし、どんなFactoryが生成可能を知らない担当者がFactory …

【Spring】バリデーション時に、入力値を保持する方法

登録画面で「登録」ボタンを押した後、 バリデーションで引っ掛かってエラーになっても 入力内容を画面に保持して置く方法についてです。 テンプレートエンジンは、Tymeleafを使用しています。 方法とし …

映画のレイティング判定をStateパターンで実装する

ユーザが見ることができる作品を、映画のレイティングシステムに従って選別できるように実装します。 映画のレイティングシステムとは、年齢制限する規制のことです。 G:全年齢 PG12:12歳以上 R15+ …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。