0

我正在为用户所需的包裹选择创建一张发票。正在创建 pdf 文件(但需要一些时间),同时代码会检查文件。该文件存在。这是文件的地址;

C:/wamp/www/proposal/file/invoice/Basic_52_60.pdf

这是文件的正确路径。我将此路径传递给另一个控制器中的函数;

redirect('email/email_invoice/'.$file);

当我在 email_invoice 函数中测试文件路径时,它只显示 c:

c: 

路径中的斜线不会被转移。我不知道到底是什么问题。

4

1 回答 1

1

CodeIgniter 将 URL 的每一段视为控制器和方法之后的参数。因此,您实际上是将 7 个变量传递给该Email::email_invoice()方法。

您可以使用某种编码将其作为一个变量传递,然后在另一侧对其进行解码,例如:

 $file = base64_encode($file);
 redirect('email/email_invoice/' . $file);

然后在 Email.php 中:

public function email_invoice($file) {
    $file = base64_decode($file);
}

或者您可以将其作为 get 参数传递:

redirect('email/email_invoice/?file=' . $file);

public function email_invoice() {
    $file = $this->input->get('file');
}

后者需要启用 $_GET 数组,默​​认情况下它不是。

更新 - 使用 Flashdata

根据一些评论,我想我会更新这个答案。base64_encode()可能会导致破坏 URL 的字符,因此您需要使用:

$file = urlencode(base64_encode($file));
redirect('email/email_invoice/' . $file);

另一方面:

public function email_invoice($file) {
    $file = urldecode(base64_decode($file));
}

正如 OP 指出的那样,可以操纵 $_GET 变量,从而使您容易受到目录遍历攻击或其他漏洞的影响。即使做得正确,您也需要额外的代码来保证安全。编码很容易被发现和改变。

文件路径可能不应该出现在 URL 中。即使不那么明显,也可以操纵 POST 数据。通过默默无闻的安全根本不是安全。更好的方法是使用flashdata

$this->session->set_flashdata('email_invoice_pdf', $file);
redirect('email/email_invoice/');

然后在你的控制器中:

public function email_invoice() {
    $file = $this->session->flashdata('email_invoice_pdf');
}

而已。该会话用于将文件路径携带到下一页请求,但之后它就消失了。

于 2013-04-09T19:19:49.147 回答