Php 序列化和取消序列化$\u POST数组是否安全?
TLDR:将$\u POST数组序列化为文件,然后根据不同的请求或脚本将其读回$\u POST变量是否安全 我意识到这是不寻常的。这是有原因的,而且需要十几页的文字来解释为什么我考虑在特殊情况下这样做,至少在这段时间内 浓缩工艺:Php 序列化和取消序列化$\u POST数组是否安全?,php,security,post,serialization,deserialization,Php,Security,Post,Serialization,Deserialization,TLDR:将$\u POST数组序列化为文件,然后根据不同的请求或脚本将其读回$\u POST变量是否安全 我意识到这是不寻常的。这是有原因的,而且需要十几页的文字来解释为什么我考虑在特殊情况下这样做,至少在这段时间内 浓缩工艺: file_put_contents('sample.post', serialize($_POST)); $_POST = unserialize(file_get_contents('sample.post')); 我已经对post变量的实际内容进行了广泛的筛选
file_put_contents('sample.post', serialize($_POST));
$_POST = unserialize(file_get_contents('sample.post'));
我已经对post变量的实际内容进行了广泛的筛选。我的问题是,序列化和取消序列化整个$\u POST数组的过程是否给了恶意用户一种攻击方法
PHP文档中说“警告。不要将不受信任的用户输入传递给unserialize()。由于对象实例化和自动加载,unserialize可能导致加载和执行代码,恶意用户可能会利用此漏洞进行攻击。”
我找到了这些描述这种攻击方法的文章。但它们似乎取决于用户是否能够直接指定要取消序列化的字符串,即取消序列化($\u POST['value'])
只要我在序列化和非序列化,对象就不能在非序列化过程中创建,对吗
我的印象是$\u POST数组将只包含字符串(尽管我在PHP文档中找不到明确提到的字符串)
据我所知,即使有人提供了与序列化对象格式匹配的字符串,它也会在序列化过程中“存储”为字符串,具有显式长度(字节长度)。因此,在取消序列化时,它将被指定为字符串。似乎因为字符串的长度在序列化过程中与字符串一起存储,所以不能像SQL注入那样从输入中中断序列化字符串的结构。我试图用一些无效的多字节字符来欺骗它,但没有成功。然而,我无法做到这一点和经验丰富的黑客能够做到这一点是两回事
我找不到关于其他攻击方法的任何其他信息
如果我遗漏了什么,请告诉我!我刚刚读到几条评论说“你永远不应该这样做”,所以我很紧张,因为我误解了一些东西。我认为如果不进一步攻击,就不可能发送一些东西作为POST变量,以便在您的场景中稍后利用
unserialize()
调用,但其他人可能会有想法。如果$\u POST有一些不可改变的东西,这可能是个问题,但我认为这可能不会发生。无论$\u POST中的内容是什么,它都已经在内存中存在过一次,因此假设serialize()
和unserialize()
工作正常,应该可以安全地执行以下操作
$serialized = serialize($userinput);
unserialize($serialized);
但是,您正在将此数据保存到中间的磁盘。在利用不同的缺陷并访问您的文件(或通过“设计”访问,如IT ops staff)后,攻击者可能能够修改保存的序列化数据,并可能在其中注入攻击。那样的话,它显然是脆弱的
因此,这确实是一个风险,尽管可能不是很高。请注意,此解决方案的安全性在很大程度上取决于您保存的序列化内容的安全性。看起来您已经掌握了基本信息。请有人解释一下否决票的原因吗?如果你告诉我为什么答案是错的,我很乐意修改或删除我的答案。