crude input validation against a blacklist
[webgit] / src / query.c
index c31cafd0aa8152bbbb2be053714fe0e27d59c1ff..e9c30e4d5191750dadf167943b0f75cd6c9ced16 100644 (file)
@@ -35,7 +35,7 @@ ctgit_query_init (struct ctgit_query* q)
   q->now = time (NULL);
 
   q->repo = NULL;
-  q->action = cwa_strndup ("main", SIZE_MAX);
+  q->action = NULL;
   q->object = NULL;
   q->head = NULL;
   llist_init (&q->repos);
@@ -76,6 +76,15 @@ ctgit_query_add_repo (struct ctgit_query* q, const char* path)
   llist_insert_next (p, &ri->node);
 }
 
+const int
+ctgit_validate_string (const char *s, size_t v_sz)
+{
+  for (const char* c = ";$&|<>!`#"; *c; ++c)
+    if (memchr (s, *c, v_sz))
+      return 0;
+
+  return 1;
+}
 
 static void
 ctgit_repo_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
@@ -83,8 +92,12 @@ ctgit_repo_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
   (void) self;
   struct ctgit_query* q = (struct ctgit_query*) u_dat;
 
-  free (q->repo);
-  q->repo = cwa_strndup (v, v_sz);
+  /* TODO validate that v is a probably legal repo name (alnum()) */
+  if (ctgit_validate_string (v, v_sz))
+    {
+      free (q->repo);
+      q->repo = cwa_strndup (v, v_sz);
+    }
 }
 
 
@@ -94,8 +107,12 @@ ctgit_action_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
   (void) self;
   struct ctgit_query* q = (struct ctgit_query*) u_dat;
 
-  free (q->action);
-  q->action = cwa_strndup (v, v_sz);
+  /* TODO validate that v is a probably legal action name alpha() */
+  if (ctgit_validate_string (v, v_sz))
+    {
+      free (q->action);
+      q->action = cwa_strndup (v, v_sz);
+    }
 }
 
 
@@ -108,8 +125,12 @@ ctgit_object_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
   if (!q->action)
     q->action = cwa_strndup ("object", SIZE_MAX);
 
-  free (q->object);
-  q->object = cwa_strndup (v, v_sz);
+  /* TODO validate that v is a probably sha1 (<=40 chars, hex) */
+  if (ctgit_validate_string (v, v_sz))
+    {
+      free (q->object);
+      q->object = cwa_strndup (v, v_sz);
+    }
 }
 
 
@@ -119,8 +140,12 @@ ctgit_ref_param (const Cgi self, const char* v, size_t v_sz, void* u_dat)
   (void) self;
   struct ctgit_query* q = (struct ctgit_query*) u_dat;
 
-  free (q->head);
-  q->head = cwa_strndup (v, v_sz);
+  /* TODO validate that v is a probably legal reference (alnum() || one of '_/.') */
+  if (ctgit_validate_string (v, v_sz))
+    {
+      free (q->head);
+      q->head = cwa_strndup (v, v_sz);
+    }
 }