2010-04-15 4 views
0

Пока все мои сайты используют в основном $ _GET для получения данных для страницы.

Ex:

editad.php?posting_id=131 

editaccount.php?user_id=2 

-> есть ли способ, чтобы скрыть или быть более обеспеченных о том, что пользователь может видеть? Я не хочу, чтобы они просто могли сказать «URL-адрес editad.php? Posting_id = 40» в URL-адресе. Я знаю, что могу использовать POSTS, но есть ли способ для GET или нет?

-> Я передаю данные через GET, а затем проверяя эти данные, проверяя, равен ли идентификатор пользователя идентификатору пользователя страницы. Если они равны, это позволит пользователю отредактировать эту страницу, если нет, она отобразит только эту страницу. Я также удостоверяюсь, что число - это число, строка строка и т. Д. Есть ли другой способ сделать его более безопасным?

ответ

4

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

* Это будет неясным для мирян. Это будет немедленно прозрачно для любого заинтересованного программиста/хакера.

+0

Это звучит лучше, независимо от того, сколько безопасности Вы поддерживаете в мировоззрении, если ваш внутренний код дерьмо, то его взломать. – Kevin

6

нет ничего плохого в том, что параметры запроса можно задать в _GET. _POST не более безопасен.

Если пользователь может редактировать объявление 30, но не рекламу 31, ваш код должен обеспечивать соблюдение этих правил.

+0

Для моего сайта, любой зарегистрированный пользователь может видеть любые объявления, но для редактирования объявления у меня есть чек, чтобы узнать, совпадает ли пользовательский сеанс user_id с user_id объявления. Если нет, они могут видеть только объявление и не редактировать его. – ggfan

+2

Звучит правильно. Просто всегда проверяйте его в коде и никогда не полагайтесь на то, что пользователь не сможет найти страницу редактирования. – timdev

+0

ggfan, это правильный подход. Никогда не предполагайте, что пользователи не найдут одну из ваших страниц, потому что я готов поспорить на будущую оплату [25 центов в час, жвачку], они ДОЛЖНЫ попасть туда. На самом деле писать код для обеспечения соблюдения ваших правил всегда лучше, чем безопасность, путем неясности/молитвы о том, что пользователи будут следовать вашим правилам. – Warty

0

Вы ответили на свой вопрос *, вы используете POST.

  • Однако я не уверен, что вы подразумеваете под «более обеспеченным». Это веб-страница, вы можете посмотреть источник и посмотреть, какие пары ключ/значение отправляются в форму.
-1

То, что я обычно делаю urldecode его (просто получить необработанное значение), а затем запустить эту функцию

function safedata($original) { 
return stripslashes(strip_tags(htmlspecialchars(trim($original)))); 
} 

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

+2

Как это поможет скрыть URL-адрес от пользователя? Он только останавливает вредоносный ввод – Duncan

1

Единственный способ защитить данные от подслушивающих устройств - использовать POST более https://.

Однако, нет никакого способа, чтобы защитить от пользователя в , так как пользователь может изменить для GET и POST данных легко.

+0

Но * средний * пользователь ... – Artelius

0

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

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

+0

Простите меня, если я ошибаюсь, но не сериализует что-то в Java, а не PHP? (обратите внимание: im довольно новый php-программист и в основном изучил Java в школе) –

+1

@Grue: Сериализация означает, что вы конвертируете какой-либо объект или структуру данных в форму, которая может быть сохранена в виде файла или передана через сеть .... Это в основном концепция ООП .... я не думаю, что это применимо только к java ..! – SpikETidE

+0

@Grue http://en.wikipedia.org/wiki/Serialization – zaf

1

Говоря о безопасности, вы можете рассмотреть возможность использования любого из следующих действий:

  1. Использование сеанса передать переменные
  2. Добавить соль + хэш-ключ в URL будет принят.

Отправитель:

$hashedKey = sha1($salt + 'posting_id=131'); 
editad.php?posting_id=131&$key=$hashedKey; 

приемник:

$params = getUrlParams(); 
$hashedKey = sha1($salt + params); 

if ($_POST['$key'] == $hashedKey) 
    continue; 
else 
    displayError(); 
0

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

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

Тогда вы можете в принципе получить доступ и хранить информацию, используя массив $ _SESSION.

Вот некоторые сайты, я только что нашел в гугле о состоянии сеанса:

+0

Это может ужасно калечить вещи. Рассмотрим случай, когда пользователь открывает две разные вещи для редактирования, например «edit.php? Id = 7», а затем открывает «edit.php? Id = 8». Затем они возвращаются и вносят изменения в страницу «7». Когда идентификатор сохранен на стороне сеанса, они теперь обновили страницу «8». –

+0

Да, я не очень люблю хранить что-либо кроме пароля, имени, электронной почты в качестве сеансов, потому что тогда становится трудно редактировать. – ggfan

0

В этом возрасте Firefox и Firebug это не так просто, чтобы скрыть то, что значения переходя от страницы к странице, особенно если это связано с URL-адресом ...

Любые «заинтересованные стороны» могут использовать разработку операторы, которые поставляются в комплекте с браузерами, чтобы посмотреть и посмотреть, как работает страница на самом деле ....

Единственное решение, как было предложено выше, - это зашифровать часть, которая показывает идентификацию пользователя с некоторой изобретательностью, разработчики знают, как это работает ....

Пример: Зачем передавать его как 'user_id' ....? Попробуйте передать его как «cxv = 32» ... Кроме того, вы можете зашифровать фактический идентификатор с помощью некоторого алгоритма, а затем расшифровать его на следующей странице. Это может остановить любую попытку изменения URL-адреса ... по крайней мере, это может сделайте это трудно ... !!

Просто используйте свое воображение ...! ;)

+0

Спасибо! Я попробую «cxv = 32» относительно user_id, но тогда это сделает редактирование кода раздражающим в будущем. – ggfan

+0

Просто добавив простой комментарий в свой код, чтобы сообщить об этом будущему редактору, вы можете избавиться от этой особой проблемы ...! – SpikETidE

0

Одна вещь, о которой люди еще не упоминали, - это использование расширения PHP Suhosin. Вы можете исправить ряд известных явлений безопасности в суперглобальных гиперссылках PHP, установив Suhosin и дополнительно контролируя максимальную длину массива/глубину/размер для каждого из $_GET, $_POST и т. Д. Он также обеспечивает прозрачное шифрование данных сеанса. Выдержка из стандартного suhosin.ini файла конфигурации:

Ключ шифрования, используемый состоит из [а] определяется пользователем строки (который может быть изменен с помощью сценария с помощью ini_set()) и необязательно User-Agent, Document-Root и 0-4 Octects [sic] из REMOTE_ADDR.

Suhosin должен по-прежнему использоваться с $_SESSION над HTTPS, так как нет никакого осуществимого способа защиты от потери информации без использования шифрования на транспортном уровне. И вы должны солить свой идентификатор сеанса с чем-то похожим на метод Suhosin для шифрования самих данных сеанса (с использованием чего-то полу-уникального для пользователя и, возможно, времени или даты).

0

Одним из способов быть немного более безопасным является использование случайного идентификатора сеанса, а не четкого текстового идентификатора пользователя. Как только пользователь войдет в систему, создайте что-то вроде 41b96964c35747e19019d2d0f2efb0d1 и используйте это для сеанса для идентификации пользователя. Таким образом, другой пользователь не может просто угадать следующий идентификатор.

-1

использование nextpage.php?uid=base64_encode($id); и nextpage.php использования

$user_id=base64_decode($_GET[uid]); 
+0

, пожалуйста, будьте любезны, чтобы упомянуть причину downvoting, чтобы я мог улучшить. – diEcho

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