是否存在对双重编码具有弹性的编码方案?

时间:2013-07-25 06:40:14

标签: encoding

是否存在对双重(或更多)编码或解码具有弹性的编码方案,以及对XSS和SQL注入攻击的安全性? 举例说明:

enc(A) --> A'
enc(A') --> A'

随后:

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

这在MVC框架中有用,在MVC框架中,我们指定在发送到Controller之前对内容进行编码。 Howerver,UI是多层的,可能(无意中)由子视图及其父级进行双重编码。

2 个答案:

答案 0 :(得分:2)

不存在有用的此类功能。您需要一个函数enc : X → Ydec : Y → X,以便

∀ x ∈ X: dec(enc(x)) = x

(即decenc)的倒数,

附加约束

∀ x ∈ X : dec(enc(enc(x))) = x

因此,X = Yenc(x) = x

encdec函数相同,并且是单位函数(返回其输入的函数):

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确保无论变量如何编码,产生的刺痛都是预期的。如果您在使用前总是立即逃脱,那么编码永远不会成为问题。