Ho questo gestore HTTP che ho creato per aggiornare le informazioni in un database SQL Express locale.Sanitizzazione della stringa per impedire i relativi percorsi URI
Mi sono reso conto che era possibile per un utente utilizzare i percorsi URI relativi "/../../file.zip" come stringa di query e sarebbe in grado di scaricare file al di fuori dell'area riservata.
Il sito non è ancora attivo, quindi non è un problema di sicurezza in questo momento, ma mi piacerebbe davvero evitare cose come questa.
Ho aggiunto una riga semplice string.replace che rimuove qualsiasi ".." dalla query di input.
C'è altro che dovrei fare qui per garantire questo?
public void ProcessRequest(HttpContext context)
{
string filesPath = "C:/Downloads/";
string fileName = context.Request.QueryString["filename"];
fileName = fileName.Replace("'", "''").Replace("..", "").Replace("/", "").Replace("\\", "");
if (!string.IsNullOrEmpty(fileName) && File.Exists(filesPath + fileName))
{
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", fileName));
context.Response.WriteFile(filesPath + fileName);
//Do work to update SQL database here
}
else
{
context.Response.ContentType = "text/plain";
context.Response.Write(filesPath + fileName + " Invalid filename");
}
}
In generale, è necessario rifiutare l'input non valido piuttosto che provare a rimuovere le sequenze dannose. Considera ciò che sostituisce con "./.". Ci sono anche molti schemi che causano stranezza, come nomi di file vuoti, punti e spazi iniziali e finali, caratteri di controllo, 'SHORTN ~ 1.AME' e potenzialmente i nomi file riservati (' com1' et al). Usare l'input nei nomi dei file è difficile da ottenere, [specialmente in Windows] (http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247 (v = vs.85) .aspx) - molto meglio se puoi (come suggerisce Jason) usa un ID generato per il nome del file sul disco locale. – bobince
@bobince Ottimi consigli lì. Questo è il motivo per cui ho fatto la domanda, poiché sapevo che ci sarebbe stato un modo migliore per avvicinarsi a questo, stavo solo cercando un po 'di sicurezza su un problema importante come questo. –