0

我有一个与安全相关的问题。我的 Web 应用程序允许用户输入 URL。URL 立即存储在数据库中(此时没有清理。这是错误的吗?)。我正在使用 Linq to SQL,所以它已经参数化了。在向用户显示超链接时,我使用的是转发器。我是否需要对超链接文本以及工具提示和 href 属性进行编码?还是我只需要对文本(显示的)进行编码。另外,我假设 URL 编码是我需要的,但我还必须使用 HTML 编码吗?

我尝试Server.UrlEncode了文本所在的所有三个属性,<script> alert("hello") </script>它似乎弄乱了 href 和文本。我猜这意味着它没有完全安全?

编辑 - 我应该添加,如果我在输出上编码,我怎样才能让它显示一个“/”而不是“%2”?谢谢

4

3 回答 3

3

您是否允许任意 http(s) 链接/文本?

文本(锚标记的 innerHtml)必须是 htmlentity 编码的。至于href:

首先在输入时,至少检查输入 url 是否真的是 http 或 https 链接,主机名和路径中只有有效字符(使用 RFC,但可以进一步限制;注意 punycode 用于非 ascii 域名,因此列入白名单字符很短)。这将防止 javascript: urls、username:password@hostname 用于网络钓鱼、ftp://、kindle:// 和其他方案的 url,在 url 中使用 \(由 IE 转换为 / 但可能会混淆您对域的阅读) ,使用过多的空格www.good%20{N次}evil.com url等。

如果您允许参数,请对各个名称和值进行 urlencode,尽管它们会影响目标(也不要 html 实体编码)。剥离 # 和之后的任何内容,因为无论如何都不会发送到目标。用双引号将 href 括起来。

如果适用,最好在用户离开您的网站时警告他们。请注意,目标站点将获取页面 url 作为引荐来源。其他选项是只允许链接到您知道无害的白名单域(除了负责任的行为外,这将防止您的网站被 netcraft、google 等识别为链接到有害网站)。

于 2010-02-26T04:55:32.447 回答
1

这是错的吗?是 输入时消毒,而不是输出。

如果在将其保存到 db 之前对其进行清理,则输出时无需编码。经验法则:信任所有层或应用程序上的数据,因此尽早清理。

于 2010-02-26T02:00:56.210 回答
1

您应该立即对输入进行清理(这与转义不同)。这意味着执行某种验证数据是 URL,或者至少只包含 URL 允许的字符。使用 Regex 或 URL 解析库来执行此操作(抱歉,我对 .NET 的 API 不太熟悉)。

您应该对输出进行编码,除非您想将其用作 HTML 元素中的 URL(您这样做!),在这种情况下您不应该进行任何编码。您肯定需要对工具提示和链接标签正文中的文本进行编码。我会更加努力地考虑如何在输入数据库之前对其进行清理。我建议浏览这个精彩的 XSS攻击示例资源。

您在输出而不是保存到数据库时进行编码的原因是每种输出介质可能具有不同的编码/转义规则。例如 HTML 与 JavaScript 不同,JavaScript 与 PDF、Flash 或 CSS 等不同...

另外我假设您在保存到数据库时使用准备好的语句,以避免 SQL 注入?

于 2010-02-26T13:32:06.373 回答