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()メソッドに渡します。

ある種のエンコーディングを使用して、それを1つの変数として渡し、次のように反対側でデコードできます。

 $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 に答える