Estoy haciendo un proyecto escolar donde estamos construyendo un servidor web simple en C. Para implementar esto, leo la primera línea de la solicitud (todo lo que necesito para mis propósitos) y analizo la cadena central como el nombre del archivo usando %código%. Así que una petición típica sería algo como:
GET / HTTP/1.0
y mi código de respuesta sería algo como esto:
// 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);
Como puede ver, ya verifico que el cliente no pueda subir un directorio. En cuanto a mi código, básicamente estoy colocando una cadena ingresada por el usuario y confiando en él, ¿hay otras características de seguridad que debo tener en cuenta? (También tengo que escribir un documento sobre esta implementación y creo que sería bueno escribir sobre seguridad).