0

在我的网络应用程序中,我试图阻止用户在运行搜索时在 freeText 参数中插入 JavaScript。

为此,我在 Velocity 头文件中编写了代码来检查查询字符串是否包含名为 freeText 的参数,如果是,则使用 replace 方法替换参数值中的字符。但是,当您加载页面时,它仍然显示原始查询字符串 - 我不确定如何用具有替换字符的新查询字符串替换原始查询字符串。

这是我的代码:

#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

在上面的代码中,replacedQueryString 变量已经按预期发生了变化(即替换已经按预期进行),但是 $request.getQueryString() 和 $request.getParameter('freeText') 仍然和之前一样,如如果更换从未发生过。

看到有一个 request.getParameter 方法可以很好地获取参数,我假设会有一个 request.setParameter 方法反过来做同样的事情,但没有。

4

2 回答 2

0

我自己设法解决了这个问题 - 结果发现还有另一个文件(在每个页面上都被调用),其中使用了 $!request.getParameter('freeText')" 变量。我已经更新了该文件,以便它使用新的 $!replacedQueryString 变量(即去掉了 JavaScript 的那个)而不是现有的“$!request.getParameter('freeText')”变量。这现在可以防止 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 回答