Skip to content

Commit dfdb498

Browse files
Martin Bentancourmikecp
authored andcommitted
Check for path traversal before uploading file
1 parent 0db177d commit dfdb498

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -590,32 +590,41 @@ public ActionResult<ContentTypeImportModel> Upload(List<IFormFile> file)
590590

591591
var root = _hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.TempFileUploads);
592592
var tempPath = Path.Combine(root,fileName);
593-
594-
using (var stream = System.IO.File.Create(tempPath))
595-
{
596-
formFile.CopyToAsync(stream).GetAwaiter().GetResult();
597-
}
598-
599-
if (ext.InvariantEquals("udt"))
593+
if (Path.GetFullPath(tempPath).StartsWith(Path.GetFullPath(root)))
600594
{
601-
model.TempFileName = Path.Combine(root, fileName);
595+
using (var stream = System.IO.File.Create(tempPath))
596+
{
597+
formFile.CopyToAsync(stream).GetAwaiter().GetResult();
598+
}
602599

603-
var xd = new XmlDocument
600+
if (ext.InvariantEquals("udt"))
604601
{
605-
XmlResolver = null
606-
};
607-
xd.Load(model.TempFileName);
602+
model.TempFileName = Path.Combine(root, fileName);
608603

609-
model.Alias = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Alias")?.FirstChild.Value;
610-
model.Name = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Name")?.FirstChild.Value;
611-
}
612-
else
604+
var xd = new XmlDocument
605+
{
606+
XmlResolver = null
607+
};
608+
xd.Load(model.TempFileName);
609+
610+
model.Alias = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Alias")?.FirstChild.Value;
611+
model.Name = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Name")?.FirstChild.Value;
612+
}
613+
else
614+
{
615+
model.Notifications.Add(new BackOfficeNotification(
616+
_localizedTextService.Localize("speechBubbles", "operationFailedHeader"),
617+
_localizedTextService.Localize("media", "disallowedFileType"),
618+
NotificationStyle.Warning));
619+
}
620+
}else
613621
{
614622
model.Notifications.Add(new BackOfficeNotification(
615-
_localizedTextService.Localize("speechBubbles","operationFailedHeader"),
616-
_localizedTextService.Localize("media","disallowedFileType"),
623+
_localizedTextService.Localize("speechBubbles", "operationFailedHeader"),
624+
_localizedTextService.Localize("media", "invalidFileName"),
617625
NotificationStyle.Warning));
618626
}
627+
619628
}
620629

621630

src/Umbraco.Web.UI/umbraco/config/lang/en.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@
325325
<key alias="clickToUpload">Click to upload</key>
326326
<key alias="orClickHereToUpload">or click here to choose files</key>
327327
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
328+
<key alias="invalidFileName">Cannot upload this file, it does not have a valid file name</key>
328329
<key alias="maxFileSize">Max file size is</key>
329330
<key alias="mediaRoot">Media root</key>
330331
<key alias="createFolderFailed">Failed to create a folder under parent id %0%</key>

src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@
329329
<key alias="clickToUpload">Click to upload</key>
330330
<key alias="orClickHereToUpload">or click here to choose files</key>
331331
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
332+
<key alias="invalidFileName">Cannot upload this file, it does not have a valid file name</key>
332333
<key alias="maxFileSize">Max file size is</key>
333334
<key alias="mediaRoot">Media root</key>
334335
<key alias="moveToSameFolderFailed">Parent and destination folders cannot be the same</key>

0 commit comments

Comments
 (0)