Skip to content

Commit 99c355f

Browse files
committed
SOLR-111 : Validate JSONP callback function name to avoid XSS
1 parent bbf16fb commit 99c355f

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

src/java/fr/paris/lutece/plugins/search/solr/util/SolrUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ public final class SolrUtil
7070
private static final String PROPERTY_ENCODE_URI_ENCODING = "search.encode.uri.encoding";
7171
private static final String DEFAULT_URI_ENCODING = "ISO-8859-1";
7272

73+
private static final String PROPERTY_CALLBACK_FUNCTION_NAME_PATTERN = "search.callbackFunctionName.pattern" ;
74+
private static final String CONSTANT_DEFAULT_FUNCTION_NAME_PATTERN = "[_$A-Za-z0-9]+";
75+
public static final String PROPERTY_CALLBACK_FUNCTION_NAME_ERROR_MESSAGE = "search.callbackFunctionName.error.message" ;
76+
7377
/**
7478
* Empty private constructor
7579
*/
@@ -201,4 +205,17 @@ public static String getEncoding( )
201205

202206
return strURIEncoding;
203207
}
208+
209+
/**
210+
* Test if the name is a valid javascript function name
211+
*
212+
* @param strName
213+
* @return true if valid
214+
*/
215+
public static boolean isValidJavascriptFunctionName( String strName )
216+
{
217+
String strFunctionNamePattern = AppPropertiesService.getProperty( PROPERTY_CALLBACK_FUNCTION_NAME_PATTERN, CONSTANT_DEFAULT_FUNCTION_NAME_PATTERN );
218+
219+
return ( strName != null && strName.matches( strFunctionNamePattern ) ) ;
220+
}
204221
}

src/java/fr/paris/lutece/plugins/search/solr/web/SolrSuggestServlet.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
package fr.paris.lutece.plugins.search.solr.web;
3535

3636
import fr.paris.lutece.plugins.search.solr.business.SolrSearchEngine;
37+
import fr.paris.lutece.plugins.search.solr.util.SolrUtil;
38+
import fr.paris.lutece.portal.service.util.AppPropertiesService;
3739

3840
import org.apache.solr.client.solrj.response.QueryResponse;
3941
import org.apache.solr.client.solrj.response.SpellCheckResponse.Collation;
@@ -59,6 +61,7 @@ public class SolrSuggestServlet extends HttpServlet
5961
{
6062
private static final long serialVersionUID = -3273825949482572338L;
6163

64+
6265
public void init( )
6366
{
6467
}
@@ -76,6 +79,13 @@ public String getSuggest( HttpServletRequest request )
7679

7780
SolrSearchEngine engine = SolrSearchEngine.getInstance( );
7881
StringBuffer result = new StringBuffer( );
82+
83+
// XSS control
84+
if ( !SolrUtil.isValidJavascriptFunctionName( callback ) )
85+
{
86+
return AppPropertiesService.getProperty( SolrUtil.PROPERTY_CALLBACK_FUNCTION_NAME_ERROR_MESSAGE, "Invalid function name" ) ;
87+
}
88+
7989
result.append( callback );
8090

8191
result.append( "({\"response\":{\"docs\":[" );

webapp/WEB-INF/conf/plugins/search-solr.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,8 @@ solr.field.or=OR
6666

6767
solr.field.switch=SWITCH
6868

69-
solr.field.and=AND
69+
solr.field.and=AND
70+
71+
#Callback jsonp function control
72+
search.callbackFunctionName.pattern=[_$A-Za-z0-9]+
73+
search.callbackFunctionName.error.message=Invalid Function Name

0 commit comments

Comments
 (0)