2016-04-04 11 views
0

In meiner Webanwendung versuche ich zu verhindern, dass Benutzer JavaScript in den freeText-Parameter einfügen, wenn sie eine Suche ausführen.Wie wird eine Abfragezeichenfolge in einer Apache Velocity-Vorlage ersetzt?

Um dies zu tun, habe ich Code in der Header Velocity-Datei geschrieben, um zu überprüfen, ob die Abfragezeichenfolge einen Parameter namens freeText enthält, und wenn ja, verwenden Sie die Methode ersetzen, um die Zeichen innerhalb des Parameterwerts zu ersetzen. Wenn Sie jedoch die Seite laden, wird weiterhin die ursprüngliche Abfragezeichenfolge angezeigt. Ich bin mir nicht sicher, wie ich die ursprüngliche Abfragezeichenfolge durch meine neue Zeichenfolge mit den ersetzten Zeichen ersetzen kann.

Dies ist mein 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 dem obigen Code hat der replacedQueryString Variable wie erwartet geändert (dh der Ersatz wie erwartet durchgeführt wurde), aber der $ request.getQueryString() und $ request.getParameter ('freeText') sind immer noch die gleichen wie zuvor, als ob die Ersetzung nie stattgefunden hätte.

Da es eine request.getParameter-Methode gibt, die zum Abrufen der Parameter geeignet ist, ging ich davon aus, dass eine request.setParameter-Methode dasselbe in umgekehrter Reihenfolge ausführen würde, aber nicht.

+0

Darf ich fragen, was Sie von diesem Ersatz erwarten? (Natürlich, anders als eine neue Zeichenfolge, wo die alte war. Welchen Prozess willst du ändern/verhindern?) Ich frage, weil ich denke, dass es zu spät sein könnte, dies zu tun, während die Ansicht ** nach * * eine Anfrage und ** serverseitig **. – MyBrainHurts

Antwort

0

ich es geschafft, um das Problem selbst zu beheben - es stellte sich heraus, dass es eine andere Datei war, in dem die $ (die auf jeder Seite aufgerufen wird)! request.getParameter ('freeText') "Variable wird verwendet. Ich habe diese Datei aktualisiert, so dass sie die neue $! replaceedQueryString-Variable (dh die mit dem ausgeschnittenen JavaScript) anstelle des vorhandenen" $! request.getParameter (' freeText ') "variable. Dadurch wird nun verhindert, dass das JavaScript auf jeder Seite ausgeführt wird.

Also, das ist der letzte Arbeitscode in der Header-Velocity-Datei:

#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 
0

Die Java-Zeichenfolge ist ein unveränderliches Objekt, was bedeutet, dass die Methode replace() eine geänderte Zeichenfolge zurückgibt, ohne die ursprüngliche Zeichenfolge zu ändern.

Da die vom HttpServletRequest-Objekt angegebene Parameterzuordnung nicht geändert werden kann, funktioniert diese Methode nicht gut, wenn Ihre Vorlagen auf $request.getParameter('freeText') angewiesen sind.

Wenn Sie sich stattdessen auf VelocityTools verlassen, können Sie sich in Ihren Vorlagen eher auf $params.freeText verlassen. Dann können Sie Ihre Melodie WEB-INF/tools.xml Datei, um diese Parameter Karte änderbare:

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

(Version 2.0+ der Werkzeuge erforderlich).

Dann wird in der Kopfzeile können Sie tun:

#set($params.freeText = params.freeText.replace('confirm','replaced'))