Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 编码超链接-何时和如何?_Asp.net_Security_Encoding_Url Encoding - Fatal编程技术网

Asp.net 编码超链接-何时和如何?

Asp.net 编码超链接-何时和如何?,asp.net,security,encoding,url-encoding,Asp.net,Security,Encoding,Url Encoding,我有一个与安全相关的问题。我的web应用程序允许用户输入URL。URL会立即存储在数据库中(此时没有存储。这是错误的吗?)。我正在使用LINQtoSQL,所以它已经参数化了。当向用户显示超链接时,我使用的是转发器。我是否需要对超链接文本以及工具提示和href属性进行编码?或者我只需要编码文本(显示)。另外,我假设URL编码是我在这里需要的,但是我也必须使用HTML编码吗 我在文本为警报(“hello”)的所有三个属性上都尝试了Server.UrlEncode,它似乎弄乱了href和文本。我猜这意

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

我在文本为
警报(“hello”)
的所有三个属性上都尝试了
Server.UrlEncode
,它似乎弄乱了href和文本。我猜这意味着它没有完全安全

编辑-我应该添加,如果我对输出进行编码,如何使其显示“/”而不是“%2”?
谢谢这是错的吗?是,输入时消毒,而不是输出时消毒

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

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

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

是否允许任意http链接/文本

文本(锚定标记的innerHtml)必须进行htmlentity编码。就href而言:

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

如果您允许使用params,则对各个名称和值进行URL编码,尽管它们会影响目标(也不进行html实体编码)。剥去#和之后的任何东西,因为这不会发送到目标。用双引号将href括起来


如果适用的话,在用户离开您的站点时发出警告可能是个好主意。请注意,目标网站将获得作为推荐人的页面url。另一种选择是只允许链接到您知道无害的白名单域(除了行为负责之外,这将防止您的站点被netcraft、google等识别为链接到有害站点)。

您允许任意http链接/文本吗

文本(锚定标记的innerHtml)必须进行htmlentity编码。就href而言:

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

如果您允许使用params,则对各个名称和值进行URL编码,尽管它们会影响目标(也不进行html实体编码)。剥去#和之后的任何东西,因为这不会发送到目标。用双引号将href括起来


如果适用的话,在用户离开您的站点时发出警告可能是个好主意。请注意,目标网站将获得作为推荐人的页面url。另一种选择是只允许链接到您知道无害的白名单域(除了行为负责之外,这将防止您的站点被netcraft、google等识别为链接到有害站点)。

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

您应该在输出时进行编码,除非您想将其用作HTML元素中的URL(您可以这样做!),在这种情况下,您不应该进行任何编码。您肯定需要对工具提示和链接标记主体中的文本进行编码。我会特别认真地思考如何在输入数据进入数据库之前对其进行清理。我建议浏览这个网页

在输出时(而不是在保存到数据库时)进行编码的原因是,每个输出介质可能具有不同的编码/转义规则。e、 HTML不同于JavaScript,后者不同于PDF、Flash或CSS等


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

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

您应该在输出时进行编码,除非您想将其用作HTML元素中的URL(您可以这样做!),在这种情况下,您不应该进行任何编码。您肯定需要对工具提示和链接标记主体中的文本进行编码。我会特别认真地思考如何在输入数据进入数据库之前对其进行清理。我建议浏览这个网页

在输出时(而不是在保存到数据库时)进行编码的原因是,每个输出介质可能具有不同的编码/转义规则。e、 HTML不同于JavaScript,后者不同于PDF、Flash或CSS等

另外,我假设您在保存到数据库时使用的是预处理语句,以避免SQL注入?