2011-01-29 120 views
2

我通过$ _GET []将urlencode()d serialize()d数组传递给我的网页。

从$ _GET反序列化()值是否安全?反序列化的数组有时会显示给用户。用户是否可以在我的代码中暴露/引用变量或函数等?换句话说,在反序列化这个值时,PHP会把它当作数据还是代码?

更新:

我看文档说: “数组/内部循环引用对象,你的序列化也将被存储的任何其他参考将会丢失”

因此,这意味着我”安全吗? :-)

+0

以前曾以某种形式问过这个问题,但我找不到这个笨蛋。 – 2011-01-29 20:03:47

回答

6

绝对,积极,没有。

你不应该盲目地信任客户端的任何东西,但是有一种方法可以让你更自信。

我假设,如果你有从客户端来的PHP序列化数据,该客户端从某个服务器获得某个点?如果是这种情况,并且客户端不修改数据,那么您可以在数据中包含散列值以验证它没有被篡改。

另一种方法是反序列化对象,但将其视为“受污染”,然后将未反序列化的数据复制并重新验证为“干净”对象。

+1

反序列化对象*在某些相对深奥的情况下可能已经是一个安全问题 - 如果可以避免,我不会这样做。看到我的答案 - 关于这个地方有一个完整的问题,但我找不到它... – 2011-01-29 20:12:22

+0

所有的答案都是内容丰富的,但这有一个实际的建议。但是,由于我的数组内容是简单的明文,我只是将它作为一个串联的字符串传递并稍后将其分开。 – sil 2011-01-29 20:21:32

6

此方法与任何其他类型的传入GET或POST数据一样“安全” - 您将在使用它之前需要对数据进行清理处理!但是,反序列化用户数据还有其他问题。

当反序列化一个对象时,PHP会查看该类是否有__wakeup magic method。如果存在,该方法将被执行。

现在这本身并不是一个巨大的安全漏洞,因为类定义从不在串行数据中传输。任何恶意代码都必须已经存在于系统中。但是,有可能出现这种情况(例如可以安装第三方代码的插件系统),我会对此非常谨慎。

另外,理论上,这允许攻击者在您的脚本中创建任何类的对象。尽管不是一个安全问题,但这绝对不是一个好习惯。

JSON编码将是一种更安全的方式,因为它只能包含“哑”数据。

+0

我喜欢这个回答。它还分离了数据和处理数据的PHP对象的概念。 *通常*,我发现这种分离使我更关键地考虑这个问题。 – 2011-01-29 20:45:27

0

您是序列化对象/数组/变量的纯数据部分,实际的可执行代码不serialized-存在这样做没有意义 - 系列化有助于两个不同worlds-执行的代码之间传输数据可以在那里相同或不同 - 对于数据无关紧要。

虽然可能的黑客行为是可能的 - 但仅基于数据 - 类和类型和值可能不同 - 它是代码的起始码,它在解序列化过程中如何应对错误。

-1

是的,它的安全。你问是否安全地序列化$ _GET数组的值。是的,这是安全的。在序列化数组期间没有任何操作被执行。由于$ _GET数组不包含任何对象,只有来自查询字符串的参数,所以在序列化/非序列化过程中不会造成任何伤害。

您提到了有关循环引用的文档中所看到的内容。不要担心,它不适用于你的情况,因为$ _GET数组内没有对象。

至于使用从$ _GET数组的实际数据,这是一个不同的问题和答案是否定的,它不是安全使用从$ _GET数组数据,而不应用一些类型的过滤器或验证的第一