Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Взлом списка SELECT
 
 автор: sega_z   (14.05.2012 в 21:14)   письмо автору
 
 

Каким то, не понятным мне, образом одному из пользователей моего сайта удалось внести в списки SELECT своё значение (которого нет в списке) при размещении информации в форме <form></form>.

Вот код списка:

<select name="tip" size="1" class="pole" id="tip"><option><?php echo @$_POST['tip'?></option><option value="Продам">Продам</option><option value="Куплю">Куплю</option><option value="Даром">Даром</option><option value="Обмен">Обмен</option>
</select>


Как это ему удалось сделать и как этого избежать?

  Ответить  
 
 автор: Slo_Nik   (14.05.2012 в 21:17)   письмо автору
 
   для: sega_z   (14.05.2012 в 21:14)
 

отказаться от такой формы подстановки значения echo @$_POST['tip']

  Ответить  
 
 автор: sega_z   (14.05.2012 в 21:23)   письмо автору
 
   для: Slo_Nik   (14.05.2012 в 21:17)
 

А как ещё можно сделать безопасную подстановку в список (без использования JS)?

  Ответить  
 
 автор: Sfinks   (14.05.2012 в 21:32)   письмо автору
 
   для: sega_z   (14.05.2012 в 21:23)
 

я вам в соседней теме написал. mysql_real_escape_string() для БД и htmlspecialchars() для HTML. Щас ваш сайт можно рвать вдоль и поперек.

  Ответить  
 
 автор: sega_z   (14.05.2012 в 21:48)   письмо автору
 
   для: Sfinks   (14.05.2012 в 21:32)
 

Хорошо спасибо Вам!
Немедленно приступлю к "заделке дыр в безопасности".

  Ответить  
 
 автор: confirm   (14.05.2012 в 21:51)   письмо автору
 
   для: sega_z   (14.05.2012 в 21:48)
 

И после этого я в ваш список все равно вставлю любые значения.

  Ответить  
 
 автор: sega_z   (14.05.2012 в 21:54)   письмо автору
 
   для: confirm   (14.05.2012 в 21:51)
 

А как , почему .....

  Ответить  
 
 автор: confirm   (14.05.2012 в 21:59)   письмо автору
 
   для: sega_z   (14.05.2012 в 21:54)
 

mysql_real_escape_string - это чтобы предотвратить sql инъекцию, но список это уже у клиента, и совсем не обязательно, что его вам вернут с вашей страницы, я могу просто взять вашу, отредактировать, вставить свое и вам отослать. Уповать на проверку реферера не стоит, его можно подделать, вот вы и получите "лишнее".
Нужно не удивляться, а проверять полученные данные.

  Ответить  
 
 автор: sega_z   (14.05.2012 в 22:03)   письмо автору
 
   для: confirm   (14.05.2012 в 21:59)
 

А как ещё, кроме вышеуказанного проверять данные?
Сравнивать все списки с первоначальным значением?

  Ответить  
 
 автор: confirm   (14.05.2012 в 22:06)   письмо автору
 
   для: sega_z   (14.05.2012 в 22:03)
 

А разве mysql_real_escape_string() и htmlspecialchars() проверяют данные?
О проверке в данной теме ни строчки не было.

  Ответить  
 
 автор: Slo_Nik   (14.05.2012 в 22:11)   письмо автору
 
   для: sega_z   (14.05.2012 в 22:03)
 

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

  Ответить  
 
 автор: Sfinks   (14.05.2012 в 22:15)   письмо автору
 
   для: sega_z   (14.05.2012 в 22:03)
 

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

  Ответить  
 
 автор: sega_z   (14.05.2012 в 22:25)   письмо автору
 
   для: Sfinks   (14.05.2012 в 22:15)
 

Ну а списки SELECT как можно проверить?

Такой вариант можно сломать:

<select name="tip" size="1" class="pole" id="tip">
<option value="Продам" <?php if (empty ($tip) or $tip=="Продам") echo "selected='selected'"?>>Продам</option>
<option value="Куплю" <?php if (empty ($tip) or $tip=="Куплю") echo "selected='selected'"?>>Куплю</option>
<option value="Даром" <?php if (empty ($tip) or $tip=="Даром") echo "selected='selected'"?>>Даром</option>
<option value="Обмен" <?php if (empty ($tip) or $tip=="Обмен") echo "selected='selected'"?>>Обмен</option>
</select>

  Ответить  
 
 автор: confirm   (14.05.2012 в 22:33)   письмо автору
 
   для: sega_z   (14.05.2012 в 22:25)
 

Удобно проверять числа на допуск сверху/снизу. Зачем для списков такие значения?. А если захочется изменить "Даром" на "Дарю", тогда все прахом?

PS. И не ставьте вы size="1" для таких списков, оно тут совсем ни к чему.

  Ответить  
 
 автор: sega_z   (14.05.2012 в 22:45)   письмо автору
 
   для: confirm   (14.05.2012 в 22:33)
 

Ну я больше не знаю как лучше сделать???

Помогите пожалуйста решить мою вторую, очень важную и похожую тему: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=86528

  Ответить  
 
 автор: confirm   (14.05.2012 в 22:53)   письмо автору
 
   для: sega_z   (14.05.2012 в 22:45)
 

<select name="tip" class="pole" id="tip"> 
<option>Выберите...</option>
<option value="1">Продам</option> 
<option value="2">Куплю</option> 
<option value="3">Даром</option> 
<option value="4">Обмен</option> 
</select>

Вот такой список в итоге должен быть. Если я проверив (int)$_POST['tip'] получу 0, значит буду знать, что пользователь не выбрал ничего, в противном случае выбор был сделан. Остается проверить, есть ли такой тип в вашей базе, и проверка по уникальному id, а не по "Продам", "Куплю"....

  Ответить  
 
 автор: sega_z   (14.05.2012 в 23:00)   письмо автору
 
   для: confirm   (14.05.2012 в 22:53)
 

Да, действительно, так будет гораздо лучше, хотя код будет более громоздким. Спасибо Вам!

  Ответить  
 
 автор: confirm   (15.05.2012 в 03:37)   письмо автору
 
   для: sega_z   (14.05.2012 в 23:00)
 

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

  Ответить  
 
 автор: ladan   (15.05.2012 в 11:54)   письмо автору
 
   для: confirm   (15.05.2012 в 03:37)
 

у меня тоже как и у автора темы такие же списки

<select name="tip" class="pole" id="tip">  
<option></option> 
<option>Продам</option>  
<option>Куплю</option>  
<option>Даром</option>  
<option>Обмен</option>  
</select>


а можно небольшой пример, как можно подменить значение между тегами <option></option>?

  Ответить  
 
 автор: confirm   (15.05.2012 в 12:07)   письмо автору
 
   для: ladan   (15.05.2012 в 11:54)
 

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

  Ответить  
 
 автор: Sfinks   (15.05.2012 в 12:22)   письмо автору
 
   для: confirm   (15.05.2012 в 12:07)
 

+ можно просто скриптом через curl отправить любые данные, как будто от формы.
+ можно в опере прикрутить user.js, который вставит в хтмл доп. <option>
Вариантов куча.

  Ответить  
 
 автор: confirm   (15.05.2012 в 12:24)   письмо автору
 
   для: Sfinks   (15.05.2012 в 12:22)
 

curl - это уже сервер, а товарища интересует как злостный юзер втыкает.
Вот только не разглашайте "тайн", а то гляди наплодите своими руками пакостников. )

  Ответить  
 
 автор: Sfinks   (15.05.2012 в 13:14)   письмо автору
 
   для: confirm   (15.05.2012 в 12:24)
 

> Вот только не разглашайте "тайн", а то гляди наплодите своими руками пакостников. )
Ну.... Тут на счет этики.... Вы не замечали, что тут всем помогают? Заходит чел, говорит (грубо) "помогите (ободрать|ограбить|пропарсить) сайт" и ему помогают =) Да че греха таить - сам с этого начинал =) Ну на счет того что не трепать, когда за язык не тянут - намек понял =)

  Ответить  
 
 автор: cheops   (15.05.2012 в 14:25)   письмо автору
 
   для: Sfinks   (15.05.2012 в 13:14)
 

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

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

  Ответить  
 
 автор: Sfinks   (15.05.2012 в 15:08)   письмо автору
 
   для: cheops   (15.05.2012 в 14:25)
 

Пока не признается. А какая разница признался сам или "и так понятно". И даже если признается.... И дело даже не в том, что ТУТ ПОМОГАЮТ. Ну не помогут тут - помогут в другом месте. И даже если конкретно Вы не поможете или я не помогу, всерн найдется кто-то другой.... И он поможет не ради помощи, а из спортивного интереса.... Скучно, нечем заняться, а тут ребус подкидывают. Интересно ведь? =) Бороться средствами "не помогания" с этим бесполезно. И я это никому не в упрек сказал. Просто констатировал факт =)

  Ответить  
 
 автор: Гавриленко Дмитрий   (15.05.2012 в 21:39)   письмо автору
 
   для: sega_z   (14.05.2012 в 21:14)
 

Как уже было написано следует использовать



<select name="tip" class="pole" id="tip">
<option>Выберите...</option> 
<option value="1">Продам</option>  
<option value="2">Куплю</option>  
<option value="3">Даром</option>  
<option value="4">Обмен</option>  
</select>



Обработчик уже должен "определить" корректны ли входящие данные.

примерно таким образом должно это быть...


<?

$tip 
$_POS['tip']
switch (
$tip) {
case 
1:
    
//Делать действия если пользователь выбрал Продам
    
break;
case 
2:
    
//Делать действия если пользователь выбрал Куплю
    
break;
case 
3:
    
//Делать действия если пользователь выбрал Даром
    
break;
case 
4:
    
//Делать действия если пользователь выбрал Обмен
    
break;
default:
    
//Если пользователь подставил свое значение ил нечего не выбрал.
}

?>

  Ответить  
 
 автор: confirm   (16.05.2012 в 03:47)   письмо автору
 
   для: Гавриленко Дмитрий   (15.05.2012 в 21:39)
 

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

  Ответить  
 
 автор: sega_z   (16.05.2012 в 10:42)   письмо автору
 
   для: confirm   (16.05.2012 в 03:47)
 

А вообще, можно ли каким то образом подставить своё значение в список SELECT не зная его "name".?

  Ответить  
 
 автор: confirm   (16.05.2012 в 11:01)   письмо автору
 
   для: sega_z   (16.05.2012 в 10:42)
 

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

  Ответить  
 
 автор: sega_z   (16.05.2012 в 11:36)   письмо автору
 
   для: confirm   (16.05.2012 в 11:01)
 

А где именно оно отображается?
php код ведь не отображается у клиента.

  Ответить  
 
 автор: confirm   (16.05.2012 в 11:38)   письмо автору
 
   для: sega_z   (16.05.2012 в 11:36)
 

Тяжелый случай. Что делает ваш php-код, как не "рожает" html страницу, которая таки будет отдана пользователю. Так? А любой браузер позволяет просмотреть исходный код страницы. А если можно просмотреть код страницы, то будет ли тайной для пользователя имена полей формы?

  Ответить  
 
 автор: sega_z   (16.05.2012 в 11:53)   письмо автору
 
   для: confirm   (16.05.2012 в 11:38)
 

Да, действительно, все имена полей видно в исходном коде страниц...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования