在" security"之后重置发布数据用它编码螺丝

时间:2015-03-02 14:35:35

标签: php

我继承了一个古老而复杂的系统,将及时更换,但现在我遇到了一个主要问题。

(加密,yay!)初始化代码中的某个地方是使用GPC变量进行调整的代码,应用addslasheshtmlspecialchars之类的内容而不考虑任何类型的上下文。你知道,这是一种绝对的nubcake会做的事情。不是你期望从一些有点昂贵的PHP软件中获得的东西。

无论如何,除了咆哮之外,有没有办法强迫PHP重新阅读请求的POSTdata并从中重新填充$_POST?我已经尝试了goto file_get_contents("php://input"); go-approach方法,但是返回空白 - 可能是初始化代码读取的,并且因为在旧版本的PHP中它可以只读一次......是的,不去那里。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我做了一个简单的测试,如:

URL?测试= ASD

<?php
$_GET['test'] = 'dsa';

print_r($_GET);
print_r($_REQUEST);
?>

输出为:Array([test] =&gt; dsa)数组([test] =&gt; asd)

我认为你也可以使用带有$ _POST的$ _REQUEST。

答案 1 :(得分:0)

不幸的是,但是你可以在这个初始化代码运行之前创建你自己的超级全局的不可变副本来自己构建这个功能。

实施例

class Superglobals
{
    private $globals;

    public static $singleton;

    public function __construct($globals)
    {
        $this->globals = $globals;
    }

    public function getOriginalValues($key)
    {
        return $this->globals[$key];
    }

    public static function init()
    {
        self::$singleton = new self($GLOBALS);
    }
    public static function restore()
    {
        foreach (['_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV'] as $key) {
            $GLOBALS[$key] = self::$singleton->getOriginalValues($key);
        }
    }
}

// at the very beginning:
Superglobals::init();

// anywhere later:
Superglobals::restore();