0

首先我的代码:

class ProfileController extends Zend_Controller_Action {

private function getUploadAvatarForm()
{
    $form = new Zend_Form;
    $form->setAttrib('enctype', 'multipart/form-data');
    $form->setAction($this->view->baseUrl('/profile/upload-avatar'))
         ->setName('uploadAvatarForm')
         ->setMethod('POST');

    $element = new Zend_Form_Element_File('avatar');
    $element->setLabel('Upload an image:')
            ->addFilter('Rename',
                array('target' => '/path/toimages/directory/' . $this->userId . '.png',
                      'overwrite' => true)
            );

    $element->addValidator('Count', false, 1);
    $element->addValidator('Size', false, 102400);
    $element->addValidator('Extension', false, 'png');
    $form->addElement($element, 'avatar')
         ->addElement('submit', 'submit_upload', array('label' => 'upload'));
    return $form;
} 

public function uploadAvatarAction()
{
    $form = $this->getUploadAvatarForm();
    $this->view->form = $form;
    if (!$this->getRequest()->isPost() || !$form->isValid($_POST)) {
        return;
    }                
    if (!$form->avatar->receive()) {
        ... error...
    }
    ... ok ...
}

}

问题是:部分业务逻辑被放入重命名过滤器中。在我看来这是值得的,但可能我错了。

我正在尝试测试它:

public function testUploadFile()
{
    $this->_doLogin('user', 'password');
    $this->getRequest()
         ->setMethod('POST'));
    $this->mockFileUpload();

    $this->dispatch('profile/upload-avatar');
    var_dump($this->getResponse()->getBody());
}

private function mockFileUpload()
{
    $_FILES = array(
        'avatar' => array(
            'name' => 'test.png',
            'type' => 'image/png',
            'tmp_name' => '/tmp/test.png',
            'error' => 0,
            'size' => 10127));
}

但得到:

文件“头像”被非法上传,可能受到攻击

你能建议我如何测试这种情况吗?(使用文件系统一切都会好起来的 - 我将为此使用 vfsStream,所以问题只是模拟上传后)

4

2 回答 2

0

我有一个类似的问题。

经过一些代码阅读和实验后,我发现我的问题是由两次调用我的表单的 isValid 函数引起的(由一个小的代码故障引起)。

不完全确定如何,但双重 isValid 导致我的 tmp 文件(上传的文件)在第二个 isValid 函数运行之前被删除,这使得 Zend_Validate_File_Upload 的第 183 行认为它不是正确的文件上传(因为第二次它寻找它已经被删除了):

如果您想检查您的临时文件是否由于某种原因不存在,请修改 Zend_Validate_File_Upload 的第 183 行:

case 0:
    var_dump(file_exists($content['tmp_name']));
    if (!is_uploaded_file($content['tmp_name'])) {
        $this->_throw($file, self::ATTACK);
    }
    break;

也许您的重命名过滤器正在移动或重命名文件?

于 2010-09-17T09:52:43.613 回答
0

在您的测试类中,将您的表单设置为使用 Zend_File_Transfer_Adapter_Http 的扩展类并覆盖 isValid() 方法。您显然需要将表单函数的范围更改为在 ProfileController 中公开。这将与 PHPUnit 一起使用。我还不确定如何将它与 Zend_Test_PHPUnit_ControllerTestCase 集成,但我需要在某个时候弄清楚它并进行更新。

$class = new ProfileController();
$form = $class->getUploadAvatarForm();
$form->getElement('avatar')->setTransferAdapter(new MockAdapter());

模拟适配器.php

class MockAdapter extends Zend_File_Transfer_Adapter_Http
{
    public function isValid($files = null)
    {
        return true;
    }
}
于 2010-07-15T00:44:59.653 回答