защита веб-страницы без заголовков - PullRequest
3 голосов
/ 08 апреля 2009

Я только что прочитал эту статью на tdwtf.com . Как правило, он описывает архивирующего бота, уничтожающего вещи, потому что он игнорирует заголовки. Затем я понял, что я не знаю, как сделать безопасность на странице без заголовков. Поэтому мой вопрос:

Какие меры безопасности я могу предпринять, кроме использования заголовков?

Я разрабатываю в основном на php, поэтому я знаком с функцией header ("Location:"). Но что еще там?

В идеале я ищу заменить логику

if (!$something_important) header("Location: somehereharmless.php");

с чем-то еще (более) безопасным?

Ответы [ 8 ]

7 голосов
/ 08 апреля 2009

Этот работает очень хорошо

if (!$something_important) {
  header("Location: somehereharmless.php");
  exit();
}

Даже если это бот, поэтому он не учитывает Location, вы вызовете выход, чтобы в любом случае поток выполнения был остановлен, поэтому никакого вреда

4 голосов
/ 08 апреля 2009
Заголовок

: расположение в порядке, если вы включите выход в конце. Вы также можете включить ссылку или что-то в этом роде.

Я обычно использую что-то вроде этого:

<?php
function redirect($url)
{
    header('Location: ' . $url);
    exit('<a href="' . $url . '">Redirecting you to: ' . $url . '</a>');
}

redirect('somepage.php');
?>

Таким образом, люди не могут обойти перенаправление и знают, что они должны быть перенаправлены.


[редактировать]

Кроме того, всегда использует POST при удалении материала. Очень легко создать подделку GET (например <img src="http://www.example.org/action.php?do=SetAsAdmin&userid=MyUserId" />).

2 голосов
/ 08 апреля 2009

Я бы сказал, что если у вас есть PHP-скрипт, который выполняет какое-то действие, которое должны выполнять только, скажем, зарегистрированные пользователи, вы должны поставить проверку на то, что вы вошли в систему прямо там в том же сценарии, так что вы можете взглянуть на него с первого взгляда и увидеть, что код защищен. Мое правило состоит в том, что существует только два допустимых шаблона для защиты защищенного кода:

if (user_is_authorized()) {
    // restricted code here
}

или Алекса

if (!user_is_authorized()) {
    // send headers or whatever if you want
    exit();
}
// restricted code here

Честно говоря, я был довольно шокирован ... или, по крайней мере, разочарован ... когда я прочитал эту статью - я не могу понять, как кто-то пришел к выводу, что сайт можно защитить с помощью заголовков HTTP. Заголовок - это не более чем текст, который отправляет ваш сервер. Это инструкция, которой клиент может следовать или игнорировать по желанию (по крайней мере, вы должны думать об этом таким образом в целях безопасности). Насколько мне известно, исходящие (ответные) HTTP-заголовки практически бесполезны для безопасности. (Это не относится к таким вещам, как HTTP-аутентификация, когда вы отправляете заголовок и получаете его обратно в ответ ... но в этом случае вы основываетесь на содержимом этого заголовка ответа, а не на отправленном вами заголовке.)

2 голосов
/ 08 апреля 2009

Убедитесь, что все ваши приёмы идемпотентны

Идемпотент означает, что выполнение одного и того же запроса много раз имеет тот же эффект, что и один раз.

1 голос
/ 08 апреля 2009

Ваше решение

<?php
die($errormessage);

Die просто остановит ваш сценарий, не выполнит запуск, не соберет данные, которые вы не должны.

1 голос
/ 08 апреля 2009
if (!$something_important) {
  header("Location: somehereharmless.php");
  //close all your db connections and other stuff you need to end..parhaps calling a function?
  die("If the redirect doesnt start in 3 seconds, please <a href=\"somehereharmless.php\">click here</a>");
}
1 голос
/ 08 апреля 2009

Причиной инцидента, указанной в указанной вами ссылке, было отсутствие оператора exit; после header();. Бот не может причинить вреда, если скрипт останавливается .-

0 голосов
/ 08 апреля 2009

Дополнение к ответу Алекса. Если у вас много заголовков («Location:»), и человек подходит для них всех. Последний выстрелит.

if($foo && $bar)
{
    header("Location: somehereharmless.php");
}

if($foo && $baz)
{
    header("Location: someotherplace.php");
}

Так что, если у этого пользователя установлены все 3 переменные, он будет перенаправлен на someotherplace.php. Если у вас нет выхода (); или умереть (); после заголовка ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...