Как сделать $ _GET более безопасным? - PullRequest
3 голосов
/ 10 сентября 2010

Я использую метод get для выполнения некоторых операций, таких как, одобрить, markasspam, удалить, для комментирования системы.я знаю, что идти по этому пути крайне небезопасно, но не могу помочь.потому что причина использования метода $ _GET состоит в том, чтобы выполнить операцию на самой странице, используя PHP_SELF, и, к вашему сведению, я использую метод post, используя флажок, чтобы выполнить операцию тоже.

Теперь, чтобы сделать его немного безопасным, я хочу рандомизировать число или сгенерировать хеш или что-то еще, а затем сравнить его, получить идентификатор и выполнить операцию

Мой текущий код выглядит примерно так.

<?php 
if($approve == 1 ) 
{ 
    ?>
    <a href="<?php echo $_SERVER['PHP_SELF']."?approve=".$id; ?>">Unapprove</a>
    <?php 
} else 
{ 
    ?> 
    <a href="<?php echo $_SERVER['PHP_SELF']."?unapprove=".$id; ?>">Approve</a>
    <?php 
}
?> 
| <a href="<?php echo $_SERVER['PHP_SELF']."?spam=".$id; ?>">Spam</a> 
| <a class="edit-comments" href="edit-comments.php?id=<?php echo $id; ?>">Edit</a> 
| <a href="<?php echo $_SERVER['PHP_SELF']."?delete=".$id; ?>">Delete</a>

и я выполняю операцию, используя этот код ..

if(isset($_GET['approve'])) {
    $id = intval($_GET['approve']);
    $query = "UPDATE comments SET approve = '0' WHERE id = '$id'";
    $result = mysql_query($query);
}

if(isset($_GET['unapprove'])) {
    $id = intval($_GET['unapprove']);
    $query = "UPDATE comments SET approve = '1' WHERE id = '$id'";
    $result = mysql_query($query);
}

if(isset($_GET['delete'])) {
    $id = intval($_GET['delete']);
    $query = "DELETE FROM comments WHERE id = '$id'";
    $result = mysql_query($query);
}

if(isset($_GET['spam'])) {
    $id = intval($_GET['spam']);
    $query = "UPDATE comments SET spam = '1' WHERE id = '$id'";
    $result = mysql_query($query);
}

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

как мне это сделать?что вы думаете по этому поводу?

РЕДАКТИРОВАТЬ: Обратите внимание, что только аутентифицированный пользователь, то есть администратор сможет выполнить эту операцию.несмотря на то, что он проходит через систему аутентификации, я хочу повысить безопасность даже для администратора.чтобы избежать экспериментов или несчастных случаев

код не является точным, это всего лишь образец, чтобы вы поняли, чего я хочу достичь.

Ответы [ 3 ]

5 голосов
/ 10 сентября 2010

Независимо от того, используете ли вы здесь параметры GET или POST, в этом контексте не имеет большого значения - что нужно сценарию first - это своего рода аутентификация.(После того, как это будет сделано, вы можете перейти к деталям безопасности, где GET немного менее безопасен, чем POST - подробности см. В комментариях.)

Я бы сказал, что у вас есть два варианта:

  • Защита всего сценария с помощью .htaccess - никаких изменений не требуется для самого сценария

  • Введение аутентификации пользователя на стороне PHP и выполнение операций, только если вошедший в систему пользователь делает запрос,Требует фундаментальных изменений в сценарии, но наиболее гибок.

Повторное редактирование:

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

Еще одним шагом будет создание временных хэшей для каждого действия, что в конечном итогезащита от ряда внешних атак.

Относительно ваших правок об использовании одноразовых хешей:

Я еще никогда не использовал одноразовые хеши в интерфейсе администраторапоэтому у меня нет опыта в этом, но я представляю, что очень простая реализация будет хранить хэши действий в отдельной таблице со столбцами hash, record и action.Всякий раз, когда ваш инструмент перечисляет несколько записей и выводит ссылки «удалить / одобрить / отменить», он генерирует три записи в хэш-таблице для каждого комментария: одну для удаления, одну для одобрения, одну для неутверждения.Тогда ссылки «удалить / одобрить / отменить» вместо идентификатора записи и команды получат правильный хеш в качестве единственного параметра.

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

1 голос
/ 10 сентября 2010

Вы можете сделать это таким образом, $_GET не является небезопасной вещью в вашем коде. Ненадежность возникает из-за того, что вы не проверяете, например, пользователь, например. разрешено удалять комментарии.

В вашем текущем коде каждый может удалить что угодно в любое время и так часто, как захочет.

Если у вас есть упаковочный код, который гарантирует, что пост-операторы if не будут выполнены, если enter good reason here, тогда все нормально.

Но вы должны попытаться проверить, что содержимое параметров действительно целые, а не просто int_val'ing их и использовать их непосредственно в базе данных.

На вашем редактировании

Вы должны проверить, что ваш параметр действительно int. intval("test") также вернет целое число, в основном 0.

Для этого вы можете рассмотреть регулярное выражение, чтобы убедиться, что строка состоит только из чисел: preg_match('/[0-9]+/', $_GET['id']);

Если это так, вы можете выполнить действие.

0 голосов
/ 10 сентября 2010

Вы не должны использовать GET для любых операций, которые изменяют данные на сервере. НИКОГДА. Вы используете его только для получения данных.

Если вы не можете использовать формы для кнопок управления (потому что за ними есть другая форма), вам следует рассмотреть этот дизайн:

  • Вы используете AJAX для выполнения запросов POST к вашему серверу
  • В средах с отключенным JavaScript, вы используете ссылки GET, такие как user.php? Action = delete, которая показывает очень простую форму на отдельной странице. Заголовок в форме спрашивает: «Вы уверены, что хотите удалить пользователя X?» и имеет две кнопки: 1) «Да» - отправляет запрос POST в сценарий операции, 2) «Нет» - отправляет пользователя обратно на страницу, где он находился
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...