【发布时间】:2018-09-12 21:41:15
【问题描述】:
假设我有一个 C# MVC 应用程序,它有一个控制器方法返回 3 种内容类型之一:image png, image jpeg, or application pdf。我已经读到可能有包含XSS 有效负载的图像。对这些返回内容进行编码/转义以使其不易受到XSS 的攻击的最佳方法是什么?控制器方法如下所示:
string contentType = "image/png";
MemoryStream mem = new MemoryStream();
if (ImageFormat == null || ImageFormat == "")
{
image.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
}
else
{
if (ImageFormat.ToUpper() == "PNG") image.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
if (ImageFormat.ToUpper() == "JPEG")
{
image.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
contentType = "image/jpeg";
}
}
mem.Position = 0;
mem.Seek(0, SeekOrigin.Begin);
return this.Image(mem, contentType);
Image在这里定义了以下类:
using …
namespace x.Classes
{
public static class ControllerExtensions
{
public static ImageResult Image(this Controller controller, Stream imageStream, string contentType)
{
return new ImageResult(imageStream, contentType);
}
}
}
OutputStream 被写入使用:
using …
namespace x.Classes
{
public class ImageResult : ActionResult
{
public ImageResult(Stream imageStream, string contentType)
{
if (imageStream == null)
throw new ArgumentNullException("imageStream");
if (contentType == null)
throw new ArgumentNullException("contentType");
this.ImageStream = imageStream;
this.ContentType = contentType;
}
public Stream ImageStream { get; private set; }
public string ContentType { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = this.ContentType;
byte[] buffer = new byte[4096];
while (true)
{
int read = this.ImageStream.Read(buffer, 0, buffer.Length);
if (read == 0)
break;
response.OutputStream.Write(buffer, 0, read);
}
response.End();
}
}
}
有没有办法让我在这里转义/编码正在写入 OutputStream 的缓冲区:`
response.OutputStream.Write(buffer, 0, read);
为了防止XSS 攻击?例如,如果返回的是 HTML:
response.OutputStream.Write(HttpUtility.HtmlEncode(buffer), 0, read);
但我们知道我们返回的是 jpeg、pdf 或 png,这意味着 Html 编码在这里不起作用。那么我们使用什么来安全地转义/编码图像/pdf?
【问题讨论】:
标签: asp.net-mvc image security encoding xss