防止 XSS 攻击但仍然显示单引号
Prevent XSS attacks but still display single quotes for instance
我想获得一些输入。
例如,一个免费的文本区域,用户可以在其中写一些句子。
在服务器端,我 HTML & javascript 编码:
_htmlEncoder.Encode(_javascriptEncoder.Encode(input))
但我努力让用户无痛。例如,如果我输入以下法语文本:
C'est une phrase importante pour moi.
编码后得到:
C\u0026#x27;est une phrase importante pour moi.
单引号被编码。显然,我之前可以解码它,但这会使它容易受到 XSS 攻击。
我一定是漏掉了一些明显的东西。我有哪些选择?
如果编码过多,就会出现这种情况。
您需要使用正好所需的编码量,不多也不少。例如,如果您的输入没有在 JavaScript 中逐字使用,那么在 JavaScript-encoding 中就没有意义。没有 makeMyStringSecure(...)
方法可以神奇地防止 XSS。您需要了解每个字符串的使用位置和方式,并根据特定情况.
对其进行编码
[Followup-question from the comments:] So in this case, I use the input in 2 different places: normal UI [and] in an email. Which means that I should encode just before using it, and not at the database level? (for XSS I mean, for sql injection, of course I will)
没错!数据库应包含原始的、未编码的值,您可以根据需要对其进行编码:如果您通过 JSON 发送它,则为 JSON 编码;如果您通过 [ 发送它,则为 XML 编码=33=],HTML 网页编码,Quoted-Printable e-mail,等等...
理想情况下,编码由 (UI) 库代码完成,而不是由业务逻辑完成。所有需要手动完成的事情都容易出错。同样,应该不需要 SQL 编码你的字符串:使用参数化查询,库会处理它!
我想获得一些输入。
例如,一个免费的文本区域,用户可以在其中写一些句子。
在服务器端,我 HTML & javascript 编码:
_htmlEncoder.Encode(_javascriptEncoder.Encode(input))
但我努力让用户无痛。例如,如果我输入以下法语文本:
C'est une phrase importante pour moi.
编码后得到:
C\u0026#x27;est une phrase importante pour moi.
单引号被编码。显然,我之前可以解码它,但这会使它容易受到 XSS 攻击。
我一定是漏掉了一些明显的东西。我有哪些选择?
如果编码过多,就会出现这种情况。
您需要使用正好所需的编码量,不多也不少。例如,如果您的输入没有在 JavaScript 中逐字使用,那么在 JavaScript-encoding 中就没有意义。没有 makeMyStringSecure(...)
方法可以神奇地防止 XSS。您需要了解每个字符串的使用位置和方式,并根据特定情况.
[Followup-question from the comments:] So in this case, I use the input in 2 different places: normal UI [and] in an email. Which means that I should encode just before using it, and not at the database level? (for XSS I mean, for sql injection, of course I will)
没错!数据库应包含原始的、未编码的值,您可以根据需要对其进行编码:如果您通过 JSON 发送它,则为 JSON 编码;如果您通过 [ 发送它,则为 XML 编码=33=],HTML 网页编码,Quoted-Printable e-mail,等等...
理想情况下,编码由 (UI) 库代码完成,而不是由业务逻辑完成。所有需要手动完成的事情都容易出错。同样,应该不需要 SQL 编码你的字符串:使用参数化查询,库会处理它!