当我输入以下文件路径时,文件会下载
http://localhost/BookStore/download.php?file=books/feedback.pdf
我不希望这种情况发生,用户应该只能在购买后下载文件,如果他们使用这种方法,那么他们就可以获得该文件。
以下是 download.php文件
的代码<?php
function downloadFile($file,$speed=1024){
if (file_exists($file)) {
if(is_dir($file)){return 'isdir';}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '.sprintf("%u", filesize($file)));
ob_clean();
$handle = fopen($file, "rb");
$chunksize=(sprintf("%u", filesize($file))/$speed);
set_time_limit(0);
while (!feof($handle)) {
echo fgets($handle, $chunksize);
flush();
}
fclose($handle);
die;
}else{return false;}
return;
}
if (isset($_GET['file'])) {
$file = $_GET['file'];
}
$result = downloadFile($file);
if ($result == FALSE) {
echo "Sorry, file does not exist.";
}
?>
是否有任何类型的验证可用于解决此问题?
由于
答案 0 :(得分:1)
当他们购买书籍时,设置会话变量,例如
$_SESSION[$book] = true;
或一系列书籍(多次购买)
$_SESSION['books] = $books;
然后在您的函数中的检查中引用它
if (file_exists($file) && isset($_SESSION[$file])) { // for a single book
或
if (isset($_SESSION['books']) && file_exists($file) && isset($_SESSION['books'][$file])) { // for an array of books
这是相对未经测试但应该给你一个良好的开端。