2013-11-14 3 views
1

У меня есть веб-страница («research.php») со ссылками на файлы PDF и вы хотите отобразить отказ от ответственности («disclaimer.html»), прежде чем кто-либо увидит файлы. На данный момент я выполнил это, проверив значение HTTP_Referrer и перенаправляя, если это не из страницы отказа от ответственности.Проблемы с безопасностью с использованием HTTP_REFERRER

Код:

$ref = $_SERVER['HTTP_REFERER']; 

if($ref !== 'http://my.site.com/disclaimer.html') { 
    die('<META HTTP-EQUIV="Refresh" CONTENT="0;URL=disclaimer.html">');} 

Исследование страница содержит ссылки на PDF файлы, которые хранятся в отдельном каталоге, который ограничивается локальным доступом с помощью .htaccess. PDF-файлы обслуживаются скриптом PHP («download.php»), который также проверяет HTTP_Referrer.

Я понимаю, что переменная HTTP_Referrer может быть подделан, что делает этот метод небезопасный, и есть несколько вопросов:

Во-первых, это возможно для кого-то, чтобы связать непосредственно с другого сайта либо на странице исследований или сценарий загрузки и spoof HTTP_Referrer, чтобы их посетители могли обойти отказ от ответственности? Основываясь на different question, я понимаю, что HTTP_Referrer можно легко подделать на ПК пользователя, но сделать его для посетителя веб-сайта гораздо труднее?

Во-вторых, есть ли способы сделать скрипт download.php более безопасным, например, поместив его в каталог, ограниченный локальным доступом, используя .htaccess? Я в настоящее время вызываю скрипт, используя простую ссылку в форме «a href =» download.php? ... », поэтому я понимаю, что это не сработает - это правильно?

Любые комментарии оценены. Суть в том, что я хочу, чтобы было трудно/невозможно сослаться на страницы или файлы с другого веб-сайта, не указав отказ или без владельца этого веб-сайта, фактически хранящего PDF-файлы на своем веб-сайте. Без сомнения, какое-либо решение будет иметь определенные уязвимости но я пытаюсь понять, насколько сложно опытному веб-дизайнеру обойти страницу отказа от ответственности.

ОБНОВЛЕНИЕ: Ответ jszobody ниже четко показывает лучший способ сделать это и поэтому отвечает на вопрос - но я все еще интересно узнать сколько работы связано с спуфингом HTTP_REFERRER из ссылки на стороннем веб-сайте, если кто-нибудь может просто объяснить это.

ответ

3

Я бы хотел использовать сеанс для этого.

На disclaimer.php:

session_start(); 
$_SESSION['viewed_disclaimer'] = true; 

На research.php:

session_start(); 
if(!$_SESSION['viewed_disclaimer']) { 
    header("Location: disclaimer.php"); 
    die(); 
} 

Вы получаете идею. Вы также можете защитить отдельные файлы PDF, не связывая их напрямую, а используя скрипт passthrough PHP.

Вызов это download.php:

session_start(); 
if(!$_SESSION['viewed_disclaimer']) { 
    header("Location: disclaimer.php"); 
    die(); 
} 

$filename = basename($_GET['filename']); 
if(file_exists("path/to/my/pdfs/" . $filename) { 
    // Send headers for a PDF file, and read out the file 
} 

Тогда вы можете связаться с download.php?filename=myfile.pdf от research.php.

Имеют смысл?

+0

Большое спасибо за это - я подумал о том, чтобы спуститься по этому маршруту, но задался вопросом, был ли HTTP_REFERRER более простым способом выполнить то, что я искал. Легко ли объяснить, почему использование сеансов - более безопасный способ сделать это? –

+0

Поскольку внешние веб-сайты и пользователи не могут обманывать переменную сеанса.Только вы можете установить их. – jszobody

+0

Кроме того, у меня уже есть скрипт download.php в том же духе, который вы предлагаете, но проверяете HTTP_REFERRER, а не используете сеансы. Необходимо/возможно защитить скрипт download.php, поместив его в каталог с ограниченным доступом? –

Смежные вопросы