]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8461 escape param "q" in WS api/languages/list
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 1 Dec 2016 10:47:56 +0000 (11:47 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 1 Dec 2016 14:13:59 +0000 (15:13 +0100)
server/sonar-server/src/main/java/org/sonar/server/language/ws/ListAction.java
server/sonar-server/src/test/java/org/sonar/server/language/ws/LanguageWsTest.java

index 14edaf7d14b1db8c9fadd71fe5cacc3686da78e7..3ea3e29b015b295d97c03a7b4963cd9e5236ff97 100644 (file)
@@ -80,7 +80,7 @@ public class ListAction implements RequestHandler {
   }
 
   private Collection<Language> listMatchingLanguages(@Nullable String query, int pageSize) {
-    Pattern pattern = Pattern.compile(query == null ? MATCH_ALL : MATCH_ALL + query + MATCH_ALL, Pattern.CASE_INSENSITIVE);
+    Pattern pattern = Pattern.compile(query == null ? MATCH_ALL : MATCH_ALL + Pattern.quote(query) + MATCH_ALL, Pattern.CASE_INSENSITIVE);
 
     SortedMap<String, Language> languagesByName = Maps.newTreeMap();
     for (Language lang : languages.all()) {
index 1e58a7a2b706c7f85530f7ef5d737ccfb22cea2a..256cdbdf4bd43b5121ba8948e6312f4f930ab380 100644 (file)
@@ -39,11 +39,12 @@ public class LanguageWsTest {
 
   private static final String CONTROLLER_LANGUAGES = "api/languages";
   private static final String ACTION_LIST = "list";
+  private static final String EMPTY_JSON_RESPONSE = "{\"languages\": []}";
 
   @Mock
   private Languages languages;
 
-  WsTester tester;
+  private WsTester tester;
 
   @Before
   public void setUp() {
@@ -77,7 +78,7 @@ public class LanguageWsTest {
   }
 
   @Test
-  public void should_list_languages() throws Exception {
+  public void list_all_languages() throws Exception {
     tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST).execute().assertJson(this.getClass(), "list.json");
 
     tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST)
@@ -89,7 +90,10 @@ public class LanguageWsTest {
     tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST)
       .setParam("ps", "10")
       .execute().assertJson(this.getClass(), "list.json");
+  }
 
+  @Test
+  public void filter_languages_by_key_or_name() throws Exception {
     tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST)
       .setParam("q", "ws")
       .execute().assertJson(this.getClass(), "list_filtered_key.json");
@@ -98,8 +102,25 @@ public class LanguageWsTest {
       .execute().assertJson(this.getClass(), "list_filtered_name.json");
   }
 
+  /**
+   * Potential vulnerability : the query provided by user must
+   * not be executed as a regexp.
+   */
+  @Test
+  public void filter_escapes_the_user_query() throws Exception {
+    // invalid regexp
+    tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST)
+      .setParam("q", "[")
+      .execute().assertJson(EMPTY_JSON_RESPONSE);
+
+    // do not consider param as a regexp
+    tester.newGetRequest(CONTROLLER_LANGUAGES, ACTION_LIST)
+      .setParam("q", ".*")
+      .execute().assertJson(EMPTY_JSON_RESPONSE);
+  }
+
   static abstract class TestLanguage extends AbstractLanguage {
-    public TestLanguage(String key, String language) {
+    TestLanguage(String key, String language) {
       super(key, language);
     }