PHP/反序列化-反序列化$\u GET value是否安全?

PHP/反序列化-反序列化$\u GET value是否安全?,php,serialization,get,Php,Serialization,Get,我正在通过$\u GET[]在我的网页上传递urlencode()序列化()数组 从$\u GET反序列化()值是否安全?反序列化的数组有时会显示给用户。用户是否可以在我的代码中公开/引用变量或函数等?换句话说,当反序列化值时,PHP是否将其视为数据或代码 更新: 我看到文件上说: “正在序列化的数组/对象中的循环引用也将被存储。任何其他引用都将丢失。” 那就是说我安全了?:-) 此方法与任何其他类型的传入GET或POST数据一样“安全”-您将始终需要在处理数据之前对其进行清理!但是,用户数据的

我正在通过$\u GET[]在我的网页上传递urlencode()序列化()数组

从$\u GET反序列化()值是否安全?反序列化的数组有时会显示给用户。用户是否可以在我的代码中公开/引用变量或函数等?换句话说,当反序列化值时,PHP是否将其视为数据或代码

更新:

我看到文件上说: “正在序列化的数组/对象中的循环引用也将被存储。任何其他引用都将丢失。”

那就是说我安全了?:-)

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

当取消序列化对象时,PHP将查看该类是否具有。如果存在该方法,将执行该方法

这本身并不是一个巨大的安全漏洞,因为类定义从未在序列化数据中传输。任何恶意代码都必须已经存在于系统中。然而,在一些可能出现问题的场景中(例如,可以安装第三方代码的插件系统),我对此非常谨慎

此外,理论上,这允许攻击者在脚本中创建任何类的对象。虽然这不是一个安全问题,但这肯定不是一个好的做法


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

绝对,肯定,不

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

我假设如果您有来自客户端的PHP序列化数据,那么该客户端在某个时候从服务器获得了这些数据?如果是这种情况,并且客户机没有修改数据,那么可以在数据中包含一个哈希,以验证数据没有被篡改


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

您仅序列化对象/数组/变量的数据部分,实际的可执行代码没有序列化-这样做没有意义-序列化有助于在两个不同的世界之间传输数据-执行的代码可以相同或不同-对于数据来说,这并不重要


虽然可能的黑客攻击是可能的,但仅基于数据-类、类型和值可能不同-这取决于代码如何处理反序列化过程中的错误。

是的,它是安全的。您正在询问序列化$\u GET数组的值是否安全。是的,它是安全的。数组序列化期间不会执行任何操作。由于$\u GET数组不包含任何对象,仅包含查询字符串中的参数,因此它在序列化/非序列化期间不会造成任何损害

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


至于使用$_GET数组中的实际数据,这是一个不同的问题,答案是否定的,使用$\u GET数组中的数据而不首先应用某种类型的筛选或验证是不安全的

以前有人以某种形式问过这一问题,但我找不到重复项。在某些相对深奥的情况下,取消对象的筛选可能已经是一个安全问题-如果可以避免,我不会这样做。看我的答案——在某个地方有一个完整的问题,但我找不到它……所有的答案都是有用的,但这有一个实用的建议。然而,由于我的数组内容是简单的纯文本,我将把它作为一个连接字符串传递,然后再拆分它。@Pekka,我同意。但我太紧张了,不会盲目地取消客户方的任何产品。我也喜欢你的答案,所以有一个+1:)我喜欢这个答案。它还分离了数据和处理数据的PHP对象的概念。一般来说,我发现这样的分离让我对这个问题的思考更为关键。但这并不是他想要的。他问序列化任何变量并通过GET传输是否安全。这个答案是100%错误的。对用户提供的数据使用unserialize()是不安全的。php.net手册甚至对此提出了警告。