是否存在对双重(或更多)编码或解码具有弹性的编码方案,以及对XSS和SQL注入攻击的安全性? 举例说明:
enc(A) --> A'
enc(A') --> A'
随后:
dec(A') --> A
dec(A) --> A
这在MVC框架中有用,在MVC框架中,我们指定在发送到Controller之前对内容进行编码。 Howerver,UI是多层的,可能(无意中)由子视图及其父级进行双重编码。
答案 0 :(得分:2)
不存在有用的此类功能。您需要一个函数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(x) = x
dec = enc
这在实践中意味着什么?让我们假设我们有一个反向转义禁止字符'
和\
的转义方案。所以我们有
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
等。
这个答案的抽象概念可以概括为
您只需记住您是否已编码该输入。
答案 1 :(得分:1)
编码不应影响正确开发的应用程序的安全性。在使用时,数据应始终安全。编码成为安全问题的唯一时间是运行转义例程,然后运行解码(或可能是编码)例程,然后使用此数据调用敏感函数。在这种情况下,解码例程将始终破坏转义例程。
例如,以下内容总是不安全的:
mysql_query("select * from user where id ='"+urldecode(addslashes($_GET[id]))+"'")
在这种情况下,paramaterization确保无论变量如何编码,产生的刺痛都是预期的。如果您在使用前总是立即逃脱,那么编码永远不会成为问题。