web-dev-qa-db-ja.com

JavaScriptでXSS攻撃を防止して、入力フィールドから文字列を正しくエスケープする方法

私は小さなアプリケーションを持っていて、XSSについてたくさん読んだので、持っている1つの入力を無害化したいと思います。

グーグルするとき、私はOWASPガイドに出くわし、入力を正しくサニタイズするために以下を使用する必要があると述べました:

String safe = ESAPI.encoder().encodeForJavaScript( request.getParameter( "input" ) );

私はコーディングに非常に慣れていないので、それをJavaScript関数にコピー/貼り付けし、機能していないようです。

私がやろうとしていることの大まかな表現は ここで実行可能 、コードです:

<input name="this" type="text" maxlength="16" id="this" />
<button onclick="run()">run</button>

<script>
function run() {

// how I used to do it
// a = document.getElementById("this").value;

safe = ESAPI.encoder().encodeForURL( document.getElementById("this").value );

alert(safe);
}

</script>

私のアプリケーションで有効な文字は数字のみです[0-9]とドット(.)。

JavaScriptで入力フィールドを正しくエスケープ/サニタイズして、XSS攻撃を防ぐにはどうすればよいですか。

1
MikeDyson

私はコーディングに非常に慣れていないので、それをJavaScript関数にコピー/貼り付けし、機能していないようです。

ESAPIはHTMLスクリプトタグで参照する必要があるライブラリであるため、機能しない可能性があります。ブラウザに付属するコアJavaScriptの一部ではありません。 ESAPIは github から入手できるようです。これには、HTMLにロードする方法を説明するREADME.mdファイルも含まれています。その部分を逃したことがありますか?あなたの質問は言いません。

また、

_var safe = ....
_

だけでなく

_safe = ....
_

これはJavaScriptでは重要です。助けることができれば、グローバル変数を作成してグローバル名前空間を汚染したくないでしょう。

私のアプリケーションで有効な文字は、数字[0-9]とドット(。)のみです。

その場合は、JavaScript正規表現を使用して、入力がこれらの文字と一致するかどうかを確認し、一致しない場合はエラーメッセージを表示することをお勧めします。 ESAPIはそのためにやり過ぎのようです。 「既知の良好な」入力を検証することは、問題のあるすべての入力を考えて、衛生ルーチンを介してそれを削除/変換するよりもはるかに安全です。そのようなことをしてください:

_var validationRegex = new RegExp('^[0-9.]+$');
var text = document.getElementById("this").value;
if (text.match(validationRegex)) { }; // do something when text matches
_

私はそれほどJavaScriptの経験がないので、JavaScriptで正規表現がどのように機能するかを読んで、そのコードを再確認することをお勧めします。ドット文字に注意してください-_[ ]_の外では、正規表現では「改行以外の任意の文字」を表します。

最後に、抽出した入力フィールドデータをサーバーに送信する場合(alert(safe)を介してデータを出力したくないだけだと私は思い込んでいます-この場合、必要はありません。そもそもそれをサニタイズします)、サーバー上のデータをサニタイズするほうがはるかに良いでしょう。クライアントでサニタイズする場合、悪意のあるユーザーがサーバーにサニタイズされていないデータを送信する可能性があります。

4
Out of Band