净化c#中的用户输入——最干净的方式

本文关键字:方式 输入 用户 净化 | 更新日期: 2023-09-27 18:19:11

通过脚本动态插入img时存在一个问题。

使用以下代码为一个位置插入图像:

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;"/>

加载图像后,脚本将执行。

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

什么是"正确的"(漂亮的、优雅的、干净的、通用的)方式呢?

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

我在想,也许有了模板,你可以在字符串上定义一个操作符,对它们进行unicode编码——类似于c#中以@为前缀的字符串对反斜杠具有特殊意义。有没有办法将这个功能添加到标准的。net字符串类中?

净化c#中的用户输入——最干净的方式

也许你可以使用新的Uri(yourUrlString)。我相信使用它(连同IsWellFormedUriString和IsWellFormedOriginalString方法)将帮助您验证输入。

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

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

我不知道你是否在使用jQuery。如果你是,那么你可以这样做:

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

这可能是无效的,这只是我的想法,但应该给你一些研究