Sto facendo un progetto scolastico dove stiamo costruendo un semplice web server in C. Per implementarlo leggo la prima riga della richiesta (tutto ciò di cui ho bisogno per i miei scopi) e analizzo la stringa centrale come il nome del file usando %codice%. Quindi una richiesta tipica sarebbe qualcosa del tipo:
GET / HTTP/1.0
e il mio codice di risposta sarebbe qualcosa del tipo:
// first token is request type
token = strtok(buffer, " \n\r");
if(strcmp(token, "GET") != 0) {
// sendResponse just sends a response to the client
// with the appropriate headers
sendResponse(connection, -1, HTTP_11_400, strlen(HTTP_11_400), NULL);
break;
}
char *request_type = token;
// second token is url
token = strtok(NULL, " \n\r");
if(strstr(token, "../") != NULL) {
sendResponse(connection, -1, HTTP_11_403, strlen(HTTP_11_403), NULL);
break;
}
char *request_url = token;
// third token is HTTP protocol
token = strtok(NULL, " \n\r");
if(strcmp(token, "HTTP/1.0") != 0 && strcmp(token, "HTTP/1.1") != 0) {
sendResponse(connection, -1, HTTP_11_400, strlen(HTTP_11_400), NULL);
break;
}
char *protocol = token;
printf("filename: %s\n", request_url);
if(strcmp(request_url, "/") == 0) {
request_url = "index.html";
}
if(*request_url == '/') {
request_url = request_url++;
}
char* fileType = strrchr(request_url, '.') + sizeof(char);
fd = open(request_url, O_RDONLY);
Come puoi vedere, ho già verificato che il client non sia in grado di risalire una directory. Guardando il mio codice, sto fondamentalmente mettendo una stringa immessa dall'utente e confidando nell'utente, ci sono altre caratteristiche di sicurezza che dovrei prendere in considerazione? (Devo anche scrivere un articolo su questa implementazione e penso che sarebbe bello scrivere sulla sicurezza).