2012-02-08 22 views
2

ユーザーからの入力を読み取り、Javaサーブレットを呼び出して データを処理するJSPフォームがあります。データが処理されると、重要な情報を格納するためにsession.setAttributeが呼び出されます。その後、Javascriptでセッション変数を読み込み、 を画面に表示しようとします。コードは、この(削除いくつかのコード)のように見える:Javascript - session.getAttributeは未定義の値を返します

<script type="text/javascript"> 
    var test = <%= session.getAttribute("mySessionVar") %>; 
    document.write (test); 
} 

ユーザーがフォームの整数を入力すると、期待どおりすべてが機能していると出力 が正しく画面に表示されます。ただし、ユーザーがフォームに文字列を入力すると、 "未定義"が画面に表示されます。

私が間違っていることを知っていますか?

答えて

1

この

var test = '<%= session.getAttribute("mySessionVar") %>'; 
+0

そして値に引用符が含まれているとどうなりますか? – RoToRa

+0

あなたはバックエンドでそれを処理する必要があります。 – czerasz

+0

"czerasz" - ありがとう、それでした! – user1197071

3

はあなたのコードが何をするかについて考えてみてください。実際には、それについて考えないでください。ブラウザに表示されているページのソースコードを開きます。値helloセッション属性を含むと仮定すると、あなたのコードは

<script type="text/javascript"> 
    var test = hello; 
    document.write (test); 
</script> 

だから値がJavaScript変数として解釈されますが生成されます。また、 helloという変数を定義していない可能性が最も高いので、結果は undefinedとなります。しかし

あなたが今だけ引用符を追加した場合:

var test = "<%= session.getAttribute("mySessionVar") %>"; 

値は、ユーザーから来ているので、あなたが言うように、それはないだけ含めることができます自分自身を引用しているので、あなたはまだ、安全ではないでしょうが、より多くのJavaScriptコードまたはHTMLコード。

(!開始時に引用符に注意してください)ユーザーが"; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1>に入る想像

含むソースコードを導く:

<script type="text/javascript"> 
    var test = ""; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1> 

そして今、あなたのサイトだけでなく、このサイトはがらくたです」と表示されます! "大きな文字で表示されますが、警告ボックスの無限ループでユーザーをロックします。正しくエスケープされていないWeb開発、NEVER EVER出力は何も(特にないユーザー入力)で

ナンバー1つのルール(それはCross-Site Scriptingと呼ばれています)。 JavaScriptの場合はStringEscapeUtils.escapeJavaScript、HTMLの場合はc:outを使用します。

は、例えば参照:PS

:あなたはデータベースを使用している場合、私は願って、あなたはあなたをエスケープしていますSQLステートメントが正しく、そうでなければ人々は非常に単純にアクセスを得ることができますあなたのデータベースとサーバに(SQL injectionと呼ばれます)

関連する問題