在Codeception中,是否可以在解析之前拦截和修改HTTP响应?如果是这样,怎么样?

时间:2017-03-15 02:51:46

标签: php json unit-testing xss codeception

我是Codeception的新手,我正在研究使用它来运行我们的集成/验收测试套件(目前有些phpunit脚本......)。这似乎是一个非常有趣的工具,但我遇到了一个可能阻止我们使用它的问题。

我试图找到一种方法来注入中间件或创建一个模块,允许我从服务器的响应中删除JSON protection string,然后由它解码REST模块。

JSON以")]}',\n"为前缀使对象无效,这可以防止某些浏览器中出现某种类型的CSRF漏洞,但它会(有意)中断json_decode()和Codeception REST验证方法。 / p>

我正在寻找一种方法来修改响应,在测试套件开始使用数据之前剥去前缀。有谁知道这是否可能?或者,如果有任何内置的方法来处理或重写响应主体?

不幸的是,从服务器输出中删除前缀不是一种选择。谢谢你的建议!

1 个答案:

答案 0 :(得分:0)

您可以在REST模块解析之前修改HTTP响应内容。

REST模块使用PhpBrowser或一些Framefork模块作为HTTP客户端。 因此,要删除JSON保护字符串,您需要创建自己的扩展PhpBrowser的模块并覆盖_getResponseContent()方法,然后在REST模块配置中将此模块用作依赖项。

假设我有REST方法http://example.dev/api/v1/test,它返回带有保护前缀的以下JSON字符串

)]}'
{"test":"smest"}

<强> /tests/api.suite.yml

class_name: ApiTester
modules:
    enabled:
        - REST:
            depends: \Helper\MyPhpBrowser
            url: 'http://example.dev/api/v1/'      
        - \Helper\Api

<强> /tests/_support/Helper/MyPhpBrowser.php

<?php
namespace Helper;

class MyPhpBrowser extends \Codeception\Module\PhpBrowser
{
    public function _getResponseContent()
    {
        $rawContent = (string)$this->client->getInternalResponse()->getContent();

        // Here we're going to delete protection prefix from response content 
        $rawContent = preg_replace("/^\)\]\}'\n/", "", $rawContent);

        return $rawContent;
    }
}

<强> /api/smestCept.php

<?php 
$I = new ApiTester($scenario);

$I->sendGET('test');

$I->seeResponseContainsJson(['test' => 'smest']);

<强>结果

$ codecept run api smestCept.php
Codeception PHP Testing Framework v2.2.4
Powered by PHPUnit 4.8.27 by Sebastian Bergmann and contributors.

Api Tests (1) -------------------------------------
✔ smestCept:  (0.29s)
---------------------------------------------------


Time: 579 ms, Memory: 12.50MB

OK (1 test, 1 assertion)