在HTML中包含用户文本输入的安全方法

时间:2018-09-14 17:14:59

标签: html asp.net-mvc security razor

这感觉很简单,但是我很难找到合适的搜索条件来获取所需的信息...

我要求我的网页的一部分显示用户先前输入的注释。该注释已保存在数据库中,我目前正在使用Razor像这样将其合并:

<span>@Model.UserNote</span>

这很好用,但是却让我的幻想感觉有些刺痛……如果用户认为他希望自己的音符像"</span><script>...</script><span>"那样,该怎么办。我知道如何使用参数来避免SQL Server中的注入攻击,但是是否有等效的HTML或另一种方法来避免在HTML中保存或注入恶意标记?在文本框之类的控件中显示文本会更安全,但可能无法为我提供所需的视觉外观。预先感谢!

1 个答案:

答案 0 :(得分:2)

您要搜索的是跨站点脚本(xss)。

一般的解决方案是根据其上下文对输出进行编码。例如,如果要将此类数据写入纯html,则需要html编码,这基本上是将<替换为&lt;等等在动态数据中(〜用户输入),以便所有内容仅呈现为文本。对于javascript上下文(例如<script>标记内的但不仅),您需要javascript编码。

.net中有HttpUtility,其中包括此类方法,例如。 HttpUtility.JavascriptStringEncode()。还有一个以前单独的AntiXSS库,可以提供更严格的(基于白名单的)编码,而不是基于黑名单的HttpUtility。因此,不要自己动手,这比第一次出现时要棘手-只需使用一个众所周知的实现即可。

Razor还具有针对普通xss攻击向量的内置保护。通过使用@ myVar,Razor会自动应用html编码,因此上面的代码是安全的。请注意,如果您需要自己应用JavaScript编码(例如,从HttpUtility调用相关方法),在javascript上下文中 是不安全的。

请注意,如果没有正确的编码,使用输入字段或文本区域并不是更安全-注入就是注入,如果可以注入,使用什么字符都没关系。

.net也有一点关系,除了自动html编码外,它还提供了另一种保护。它使用“请求验证”,默认情况下,不允许请求参数(get或post)包含小于字符(<),后跟字母。除非故意关闭此功能,否则该请求将被框架阻止为潜在的不安全行为。

您的原始示例被这两种机制(自动编码和请求验证)所阻止。

值得注意的是,就xss而言,这是冰山一角。虽然.net中的这些保护有所帮助,但它们通常并不足够。尽管您的示例是安全的,但通常您需要了解xss以及这些保护能够产生安全代码的确切作用。