在python中,有时候会遇到序列化和反序列化的问题,这时候用到了Pickle/CPickle这个库,他的作用就是对给定的内容进行序列化以及反序列化。

但是在反序列化的时候,同样会出现类似于PHP中的wakeup魔术方法,在返序列化的时候会被自动执行。那就是类里面的__reduce__方法。

代码如下:

import cPickle
import subprocess

class A(object):
    def __reduce__(self):
        return (subprocess.Popen, (('calc.exe',),))
        
x = cPickle.dumps(A())
cPickle.loads(x)

所以在开发过程中,千万不要将外部传输过来不可信的字符串,未经验证的就进行反序列化,这样往往会导致很严重的安全问题。