0

In my web application I'm trying to prevent users from inserting JavaScript in the freeText parameter when they're running a search.

To do this, I've written code in the header Velocity file to check whether the query string contains a parameter called freeText, and if so, use the replace method to replace the characters within the parameter value. However, when you load the page, it still displays the original query string - I'm unsure on how to replace the original query string with my new one which has the replaced characters.

This is my code:

#set($freeTextParameter = "$request.getParameter('freeText')")
freeTextParameter: $freeTextParameter

#if($freeTextParameter)
    ##Do the replacement: 
    #set($replacedQueryString = "$freeTextParameter.replace('confirm','replaced')")
    replacedQueryString after doing the replace: $replacedQueryString
    The query string now: $request.getQueryString()
    The freeText parameter now: $request.getParameter('freeText')
#end

In the code above, the replacedQueryString variable has changed as expected (ie the replacement has been carried out as expected), but the $request.getQueryString() and $request.getParameter('freeText') are still the same as before, as if the replacement had never happened.

Seeing as there is a request.getParameter method which works fine for getting the parameters, I assumed there would be a request.setParameter method to do the same thing in reverse, but there isn't.

4

2 に答える 2

0

私は自分で問題を解決することができました - $!request.getParameter('freeText')" 変数が使用されている別のファイル (すべてのページで呼び出される) があることが判明しました。既存の "$!request.getParameter('freeText')" 変数の代わりに、新しい $!replacedQueryString 変数 (つまり、JavaScript が取り除かれたもの) を使用します. これにより、すべてのページで JavaScript が実行されるのを防ぐことができます.

したがって、これはヘッダー Velocity ファイルの最終的な作業コードです。

    #set($freeTextParameter = "$!m.request.httpRequest.getParameter('freeText')")
#if($freeTextParameter)
    #set($replacedQueryString = "$freeTextParameter.replace('confirm','').replace('<','').replace('>','').replace('(','').replace(')','').replace(';','').replace('/','').replace('\"','').replace('&','').replace('+','').replace('script','').replace('prompt','').replace('*','').replace('.','')")
#end
于 2016-04-11T11:01:10.037 に答える
0

Java String は不変オブジェクトです。つまり、replace()メソッドは元の文字列を変更せずに、変更された文字列を返します。

HttpServletRequest オブジェクトによって指定されたパラメーター マップは変更できないため、テンプレートが に依存している場合、このアプローチはうまく機能しません$request.getParameter('freeText')

代わりに、VelocityTools に依存している場合は、むしろ$params.freeTextテンプレートで依存できます。次に、WEB-INF/tools.xmlファイルを調整して、このパラメーター マップを変更可能にします。

<?xml version="1.0">
<tools>
  <toolbox scope="request">
    <tool key="params" readOnly="false"/>
    ...
  </toolbox>
  ...
</tools>

(ツールのバージョン 2.0+ が必要です)。

次に、ヘッダーで次のことができます。

#set($params.freeText = params.freeText.replace('confirm','replaced'))
于 2016-04-06T05:52:58.323 に答える