Mam tę procedurę obsługi HTTP, którą utworzyłem, aby zaktualizować informacje w lokalnej bazie danych SQL Express.Łańcuch dezynfekcji, aby zapobiec względnym ścieżkom URI.
Uświadomiłem sobie, że użytkownik może używać względnych ścieżek URI "/../../file.zip" jako ciągu zapytania i będzie mógł pobierać pliki poza obszar zastrzeżony.
Witryna nie jest jeszcze dostępna, więc nie jest to obecnie kwestia bezpieczeństwa, ale naprawdę chciałabym zapobiec takim sytuacjom.
Dodałem prostą linię string.replace, która usuwa wszelkie ".." z zapytania wejściowego.
Czy jest coś jeszcze, co powinienem zrobić, aby to zabezpieczyć?
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");
}
}
Generalnie powinieneś odrzucić nieprawidłowe dane wejściowe zamiast próbować usunąć szkodliwe sekwencje - zastanów się, co twój zamiennik robi z './.'. Istnieje również szereg wzorców powodujących dziwaczność, takich jak puste nazwy plików, początkowe i końcowe kropki i spacje, znaki sterujące, 'SHORTN ~ 1.AME' i potencjalnie zarezerwowane nazwy plików (' com1' i inni). Używanie danych wejściowych w nazwach plików jest trudne do uzyskania, [szczególnie w Windows] (http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247 (v = vs.85) .aspx) - znacznie lepiej jeśli możesz (jak sugeruje Jason) użyć wygenerowanego identyfikatora dla nazwy pliku na dysku lokalnym. – bobince
@bobince Świetne wskazówki tam. Oto dlaczego zadałem to pytanie, ponieważ wiedziałem, że będzie lepszy sposób podejścia do tego problemu, szukałem tylko pewnej wskazówki w tak ważnym temacie. –