我正在为用户所需的包选择创建发票。正在创建pdf文件(但需要一些时间),而代码会检查文件。该文件存在。这是文件的地址;
C:/wamp/www/proposal/file/invoice/Basic_52_60.pdf
这是文件的正确路径。我将此路径传递给另一个控制器中的函数;
redirect('email/email_invoice/'.$file);
当我在email_invoice函数中测试文件路径时,它只显示c:
c:
路径中的斜杠不会被传输。我不知道究竟是什么问题。
答案 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');
}
就是这样。该会话用于将文件路径传递给下一页请求,但之后它就消失了。