防止 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 编码你的字符串:使用参数化查询,库会处理它!