在C#中清理用户输入 - 最干净的方法?

3
通过脚本动态插入图片时需要注意一个问题。
下面是用于在某个位置插入图片的代码:
newPlace.find('.PlaceThumb').append('<img src="' + place.ThumbnailUrl + '" alt="' + place.Name + '" width="50px" style = "padding:2px;"/>');

有人可能会给他们的地方起名为:" onload="alert('hi')",标签将被呈现为:
<img src="/item.aspx?id=123" alt="" onload="alert('hi')" width="50px" style = "padding:2px;"/>

当图片加载完成后,脚本将会执行。

虽然只有 和 标签支持 onload 属性,但这也是一个好的教训,永远不要相信用户输入。

什么是“正确”的(美观、优雅、干净、通用)做法:

newPlace.find('.PlaceThumb').append('<img src="' + place.ThumbnailUrl + '" alt="' + place.Name.replace('"', '&quot;') + '" width="50px" style = "padding:2px;"/>');

我在考虑,也许可以使用模板来定义一个操作符,使其能够对字符串进行UU编码——类似于C#中以@为前缀的字符串具有反斜杠方面的特殊含义。是否有一种方法可以将此功能添加到标准的.net字符串类中呢?


顺便提一下,经过进一步的研究,看起来 "@" 是一个编译器级别的语法糖,只适用于字符串字面量。 - John Shedletsky
1
代码不是C#代码 - 看起来像JavaScript。 - Oded
这是关于XSS预防的内容。一个需要考虑的事情是:在客户端使用JavaScript限制用户输入为字母数字字符,在服务器端通过删除输入字符串中的所有非字母数字字符进行验证。 - frenchie
字符串清理在C#服务器端处理。 - John Shedletsky
newPlace.find('.PlaceThumb').append('<img src="' + place.ThumbnailUrl + '" alt="' + place.Name + '" width="50px" style = "padding:2px;"/>'); 在 C# 中在服务器端执行。它将 HTML 渲染到响应中,就像 PHP echo 一样。 - John Shedletsky
显示剩余3条评论
3个回答

0

AntiXSS库是一个可能的解决方案。由于您的代码似乎在数据和呈现的HTML之间有大量层级(ASP.Net ->将HTML模板作为呈现JavaScript的一部分呈现 ->浏览器加载JavaScript ->某些内容执行脚本,然后使用JQuery基于模板创建HTML),因此请非常小心编码。

注意:考虑将CSS(宽度和样式属性)与HTML布局分离,这是良好的HTML实践。


0
也许你可以使用 new Uri(yourUrlString)。我相信使用它(以及方法IsWellFormedUriString和IsWellFormedOriginalString)将有助于验证输入。

-1

我无法确定您是否正在使用jQuery。如果是的话,您可以像这样做:

newPlace.find('.PlaceThumb').append('<img>');
$('.PlaceThumb img').attr('src', place.ThumbnailUrl).attr('alt', place.Name);

这可能不是有效的,只是我脑海中的想法,但应该可以让你有所了解。


问题已标记为 "C#" 和 "asp.net"。 - RickNZ
1
@RickNZ - 是的,但那显然是Javascript。你可以通过单引号来判断,因为在C#中不使用单引号来表示字符串。 - Erik Funkenbusch
是的,但JavaScript是从C#生成的(至少这是我的理解;我承认问题有点含糊不清)。 - RickNZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接