Encoding 是否有任何编码方案能够适应双重编码?

Encoding 是否有任何编码方案能够适应双重编码?,encoding,Encoding,是否有任何编码方案能够抵抗双重(或更多)编码或解码,并且能够安全抵御XSS和SQL注入攻击? 举例说明: enc(A) --> A' enc(A') --> A' 随后: dec(A') --> A dec(A) --> A 这在MVC框架中很有用,在MVC框架中,我们指定在发送到控制器之前对内容进行编码。然而,UI是多层的,并且可能(无意中)对子视图及其父视图进行双重编码。编码不应影响正确开发的应用程序的安全性。在使用时,数据应始终保持安全。编码成为安全问题的唯一时

是否有任何编码方案能够抵抗双重(或更多)编码或解码,并且能够安全抵御XSS和SQL注入攻击? 举例说明:

enc(A) --> A'
enc(A') --> A'
随后:

dec(A') --> A
dec(A) --> A

这在MVC框架中很有用,在MVC框架中,我们指定在发送到控制器之前对内容进行编码。然而,UI是多层的,并且可能(无意中)对子视图及其父视图进行双重编码。

编码不应影响正确开发的应用程序的安全性。在使用时,数据应始终保持安全。编码成为安全问题的唯一时间是,如果运行转义例程,然后运行解码(或者可能是编码)例程,然后使用该数据调用敏感函数。在这种情况下,解码例程总是会破坏转义例程

例如,以下内容总是不安全的:

mysql_query("select * from user where id ='"+urldecode(addslashes($_GET[id]))+"'")

在这种情况下,参数化确保无论变量如何编码,结果都是预期的结果。如果您总是在使用前立即退出,那么编码将永远不会成为问题。

不存在有用的函数。您需要一个函数
enc:X→ Y
dec:Y→ X
以便

∀ x ∈ X: dec(enc(x)) = x
(也就是说,
dec
enc
的反比)

附加的约束条件是

∀ x ∈ X : dec(enc(enc(x))) = x
因此,
X=Y
enc(X)=X

enc
dec
函数相同,是单位函数(返回其输入的函数):


这在实际中意味着什么?让我们假设我们有一个转义方案,它反斜杠禁止的字符
'
\
。所以我们有

enc( 'foo\ )   = \'foo\\
现在让我们假设用户输入一个字符串
\'foo\\\
,那么转义的输出应该是

enc( \'foo\\ ) = \\\'foo\\\\
这与
enc(enc('foo\)
的结果相同

无法判断此函数是否为
enc
的输出

X时,这会发生变化≠ Y
(即
enc
的输出与未编码的输入具有不同的类型)。让我们定义一个多态的
enc
,如下所示:

enc : X → Y | Y → Y
dec : Y → X
∀ x ∈ X : dec(enc(x))      = x
∀ x ∈ X : dec(enc(enc(x))) = x
∀ y ∈ Y : enc(y) = y
在大多数编程语言中,这可以通过面向对象实现:

class Str {
  method enc() : EncodedStr { some encoding code }
}
class EncodedStr {
  method enc() : EncodedStr { return self } // the unit function
  method dec() : Str        { some decoding code }
}
也就是说,
∀ x∈ Str:x.enc.enc.dec=x

这个答案的抽象概念可以概括为

您只需记住是否已经对输入进行了编码


这与IT安全有什么关系?添加了更多的信息…在问这个问题之前,你真的搜索过这个网站吗?关于如何净化输入,我们有很多答案。
class Str {
  method enc() : EncodedStr { some encoding code }
}
class EncodedStr {
  method enc() : EncodedStr { return self } // the unit function
  method dec() : Str        { some decoding code }
}