在codeigniter中不检索文件路径

时间:2013-04-09 18:54:17

标签: file codeigniter filepath email-attachments

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

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

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

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

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

c: 

路径中的斜杠不会被传输。我不知道究竟是什么问题。

1 个答案:

答案 0 :(得分: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()可能导致破坏网址的字符,因此您需要使用:

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

另一方面:

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

正如OP指出的那样,$ _GET变量可以被操纵,让你对directory traversal attacks或其他漏洞开放。即使做得好,您也需要额外的安全代码。编码很容易被发现和改变。

文件路径可能不应该在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');
}

就是这样。该会话用于将文件路径传递给下一页请求,但之后它就消失了。