Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Безопасность. Передача данных через форму. 
V
    Опции темы
alexey009
Дата 29.7.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

Репутация: 2
Всего: 2



Требуется передать данные серверу через форму, вот например
Код

<form method="POST" action="index.php">
<input name="name" type="text" value="">
<input name="text" type="text" value="">
<input type="hidden" name="id" value="1">
<input type="submit" name="enter" value="Send">
</form>

Соответственно обработка:
Код

if(isset($_POST['enter'])){
$name = addslashes(trim($_POST['name']));
$text = addslashes(trim($_POST['text']));
if(!preg_match("/^([0-9]+)$/i", $_POST['id'])){
echo 'попытка взлома';
exit;
}
/*
Запись в БД
*/
}

ну и вывод соответственно
Код

/*
Получение даных из БД
*/
$name = htmlspecialchars(stripslashes($name));
$text = htmlspecialchars(stripslashes($text));
/*
вывод результатов
*/

И наконец вопросы:
1. Какие тут остались дыры?
2. Как можно улучшить код?
3. Что ещё вы посоветуете по теме?
PM MAIL   Вверх
Mal Hack
Дата 29.7.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Если база mysql, то mysql_real_escape_string, а код который у вас не годится
PM ICQ   Вверх
alexey009
Дата 29.7.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

Репутация: 2
Всего: 2



Можно поконкретнее, что именно тут не так?
PM MAIL   Вверх
Mal Hack
Дата 29.7.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



1. Данные в Базу должны писаться чистыми, пропущенными через mysql_real_escape_string, этот механизм с помощью addshaches/stripslaches не реализуется.
2. Проверка на целочисленность ID является абсурдом, когда есть ctype_digit() или уж хотя бы is_numeric.

PM ICQ   Вверх
alexey009
Дата 29.7.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

Репутация: 2
Всего: 2



Mal Hack, с 1 понял, а вот со 2-ым.
А если какой-нибудь хакер соберет у себя форму, ну и sql запрос выполнит!

Тогда так получается.
Код

if(isset($_POST['enter'])){
$name = mysql_real_escape_string(trim($_POST['name']));
$text = mysql_real_escape_string(trim($_POST['text']));
if(!ctype_digit($_POST['id'])){
echo 'попытка взлома';
exit;
}
/*
Запись в БД MySQL
*/
}


А с выводом все ок?
PM MAIL   Вверх
Mal Hack
Дата 29.7.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(alexey009 @  29.7.2008,  22:01 Найти цитируемый пост)
 а вот со 2-ым.

А что тут не понялтно? Те функции которые привел я - более рациональный вариант решения вашей задачи.
Вообще как правило, если данные не верны, то выводится сообщение об ошибке, а не вызываетяс exit.

Цитата(alexey009 @  29.7.2008,  22:01 Найти цитируемый пост)
А с выводом все ок? 

В базе будут "сырые" данные, т.е. что в скрипт пришло, то в базу и попало. 
А уж что-то и как вам надо вывести - смотрите сами. Надо вывести html - применяйте htmlspecialchars. Тут уж вы решаете в зависимости от задачи.
PM ICQ   Вверх
alexey009
Дата 29.7.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

Репутация: 2
Всего: 2



Цитата(Mal Hack @  29.7.2008,  21:06 Найти цитируемый пост)
А что тут не понялтно? Те функции которые привел я - более рациональный вариант решения вашей задачи.Вообще как правило, если данные не верны, то выводится сообщение об ошибке, а не вызываетяс exit.


Не знал я этих функций...
Если что, то у меня там выводилась ошибка и уж потом уже exit:)

а какие тут ещё могут быть дыры?
PM MAIL   Вверх
Mal Hack
Дата 29.7.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(alexey009 @  29.7.2008,  22:19 Найти цитируемый пост)
а какие тут ещё могут быть дыры? 

Ошибки надо в другой части кода смотреть =) Точнее во всем =) Тогда и будет видно где дыры =)
PM ICQ   Вверх
skyboy
Дата 29.7.2008, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(alexey009 @  29.7.2008,  20:01 Найти цитируемый пост)
А если какой-нибудь хакер соберет у себя форму, ну и sql запрос выполнит!

значит так.
то, что можно назвать "взломом сервера".
при "идеальной" алгоритмической части(т.е. не пишем имя пользователя в поле "количество детей" и т.п. - без алгоритмичеких ошибок) возможны следующие варианты.
1. sql injection: когда вместо строкового значения приходит "' or 1=1" или нечто подобное. от сего защищает mysql_real_escape_string, которая экранирует кавычки.
2. некорректный ввод: когда вместо числового значения приходит "блаблбла". тут - либо проверять тип(is_numeric, ctype_digit,либо регулярными выражениями) и выдавать вменяемое сообщение "дурак, не то ввел smile", либо ничего не выдавать и запись в БД не вести, либо пытаться выполнить запрос без проверок и полученную ошибку mysql не выводить(естественно), а писать в логи. чтоб потом на ночь перед сном читать smile
3. хакер узнает версию PHP, Apache или MySQL, находит известные уязвимости и юзает эксплоиты(вариант - находит уязвимости и создает эксплоити). тут противодействовать(особенно - если хостинг не выделенный сервер, а виртуальный выделенный сервер) особо некак, но можно изучить вопорс, разыскивая уязвимости самостоятельно и примеряя их на свою систему(к примеру, на bugs.php.net поискать "buffer overflow", в результатах поиска выявить признанные и определить,относится ли к твоей версии; аналогично, можно изучит багтрекинговую систему для apache(security и bugs) и mysql). или изучить сводные порталы с информацией о уязвимостя(известные мне, правда, порядком "опопсели" за последние несколько лет :(), типа securitylab.ru или xaker.ru(возможно, англоязычные сообщества более живучими оказались...) 
впрочем, третий варант требует времени, трудозатрат и редкой в эпоху "кодеров" квалификации. Потому такой взлом наименее вероятен.
--------
то, что можно назвать "взломом клиента" - если у тебя выводятся какие-то данные, полученные от клиента, то клиент может разместить html-код. если код не будет заэкранирован(к примеру, лучше всего, как считается, делаеть это либо при помоши strip_tags без указания исключений, либо при помощи htmlspecialchars). В противном случае, клиент сможет вставить в твою страницу не просто html-код,который максимум - порушит дизайн, а javascript, который может натворить немало неприятных вещей: дискредитирует сайт, "украдет" авторизационные данные*(оправив на сайт, контролируемый автором зловредного кода) и много чего не менее неприятного.
--------
Указанное выше - это, если можно так сказать, "базовый" уровень. при использовании сессий в PHP(разве их кто-то не использует?) возможны также разные не очень приятные ситуации. но связаны уже не со "взломом сервера", а(как "максимум") - с воровством авторизационной информации пользователя. посмотреть можно по факту поиска. хотя бы есть тема "Безопасность. О чем подумать?"
PM MAIL   Вверх
alexey009
Дата 30.7.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 28.7.2008

Репутация: 2
Всего: 2



Спасибоsmile буду переваривать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.