Yerel bir SQL Express veritabanındaki bilgileri güncellemek için oluşturduğum bu HTTP işleyicisine sahibim.Göreli URI yollarını önlemek için dizgi temizleme
Bir kullanıcının, sorgu dizesi olarak "/../../file.zip" gibi göreli URI yollarını kullanmasının mümkün olduğunu ve kısıtlanmış alanın dışındaki dosyaları karşıdan yükleyebileceğini anladım.
Site henüz yayında değil, bu yüzden şu anda bir güvenlik sorunu değil, bunun gibi şeyleri önlemek isterim.
Giriş sorgusundan herhangi bir ".." öğesini kaldıran basit bir string.replace satırı ekledim.
Bunu sağlamak için burada yapmam gereken başka bir şey var mı?
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");
}
}
Genelde, zararlı dizileri kaldırmaya çalışmak yerine geçersiz girdiyi reddetmelisiniz - değiştirmenin ne yaptığını düşünün. ./. Boş dosya isimleri, öndeki ve sondaki noktalar ve boşluklar, kontrol karakterleri, 'SHORTN ~ 1.AME' ve potansiyel olarak ayrılmış dosya adları ('com1' et al) gibi tuhaflıklara neden olan bir dizi desen de vardır. Dosya adlarında girdiyi kullanmak, özellikle Windows'da (http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247 (v = vs.85) .aspx) doğru almak zor. eğer yapabiliyorsanız (Jason'ın önerdiği gibi) yerel diskteki dosya adı için üretilmiş bir kimlik kullanın. – bobince
@bobince Harika ipuçları var. Bu yüzden soruyu sordum, bunun için daha iyi bir yol olacağını bildiğimden, bunun gibi önemli bir konuya biraz baktım. –