|
|
|
| Каким то, не понятным мне, образом одному из пользователей моего сайта удалось внести в списки 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>
|
Как это ему удалось сделать и как этого избежать? | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:14)
| | отказаться от такой формы подстановки значения echo @$_POST['tip'] | |
|
|
|
|
|
|
|
для: Slo_Nik
(14.05.2012 в 21:17)
| | А как ещё можно сделать безопасную подстановку в список (без использования JS)? | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:23)
| | я вам в соседней теме написал. mysql_real_escape_string() для БД и htmlspecialchars() для HTML. Щас ваш сайт можно рвать вдоль и поперек. | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 21:32)
| | Хорошо спасибо Вам!
Немедленно приступлю к "заделке дыр в безопасности". | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:48)
| | И после этого я в ваш список все равно вставлю любые значения. | |
|
|
|
|
|
|
|
для: confirm
(14.05.2012 в 21:51)
| | А как , почему ..... | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:54)
| | mysql_real_escape_string - это чтобы предотвратить sql инъекцию, но список это уже у клиента, и совсем не обязательно, что его вам вернут с вашей страницы, я могу просто взять вашу, отредактировать, вставить свое и вам отослать. Уповать на проверку реферера не стоит, его можно подделать, вот вы и получите "лишнее".
Нужно не удивляться, а проверять полученные данные. | |
|
|
|
|
|
|
|
для: confirm
(14.05.2012 в 21:59)
| | А как ещё, кроме вышеуказанного проверять данные?
Сравнивать все списки с первоначальным значением? | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 22:03)
| | А разве mysql_real_escape_string() и htmlspecialchars() проверяют данные?
О проверке в данной теме ни строчки не было. | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 22:03)
| | что Вы ожидаете получить, вот то и проверяйте....
если ожидаете строку, то проверяйте на символы в строке...
если число, то проверяйте, чтобы в данных, полученных от пользователя было число...
при помощи регулярных выражений можно проверить | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 22:03)
| | Проверять нужно все поля, полученные из формы, на соответствие требуемому формату. Если у вас простое текстовое поле, которое может содержать все что угодно, того что я написал достаточно. Если же это что-то более конкретное, то и проверять нужно на то чтоб е-майл был е-майлом, дата датой, целое целым, а элемент списка - допустимым и т.д. | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 22:25)
| | Удобно проверять числа на допуск сверху/снизу. Зачем для списков такие значения?. А если захочется изменить "Даром" на "Дарю", тогда все прахом?
PS. И не ставьте вы size="1" для таких списков, оно тут совсем ни к чему. | |
|
|
|
|
|
|
|
для: confirm
(14.05.2012 в 22:33)
| | Ну я больше не знаю как лучше сделать???
Помогите пожалуйста решить мою вторую, очень важную и похожую тему: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=86528 | |
|
|
|
|
|
|
|
для: 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, а не по "Продам", "Куплю".... | |
|
|
|
|
|
|
|
для: confirm
(14.05.2012 в 22:53)
| | Да, действительно, так будет гораздо лучше, хотя код будет более громоздким. Спасибо Вам! | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 23:00)
| | Это смотря как проверку производить, можно сделать и легко, а можно и сверх громоздко, все зависит от того как вы проверяете, и каким образом организованы ваши данные. | |
|
|
|
|
|
|
|
для: 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>? | |
|
|
|
|
|
|
|
для: ladan
(15.05.2012 в 11:54)
| | Ну что непонятного, вроде бы как сказал уже - сделаю копию вашей странички и буду запускать ее локально, но уже со значениями в списках и т.п., мною проставленными. А для того чтобы обмануть сервер, могу использовать и фрейм плавающий, вполне хватит. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 12:07)
| | + можно просто скриптом через curl отправить любые данные, как будто от формы.
+ можно в опере прикрутить user.js, который вставит в хтмл доп. <option>
Вариантов куча. | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 12:22)
| | curl - это уже сервер, а товарища интересует как злостный юзер втыкает.
Вот только не разглашайте "тайн", а то гляди наплодите своими руками пакостников. ) | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 12:24)
| | > Вот только не разглашайте "тайн", а то гляди наплодите своими руками пакостников. )
Ну.... Тут на счет этики.... Вы не замечали, что тут всем помогают? Заходит чел, говорит (грубо) "помогите (ободрать|ограбить|пропарсить) сайт" и ему помогают =) Да че греха таить - сам с этого начинал =) Ну на счет того что не трепать, когда за язык не тянут - намек понял =) | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 13:14)
| | Ну как всем... в протоколе HTTP есть немного политики, которая гласит, что клиент - всегда прав, хочет он использовать анимайзер - нельзя запрещать, может у него ВИЧ или какая другая болезнь и он не хочет, чтобы окружающие об этом знали. Хочет человек получать информацию без вашей рекламы и вообще все перефигачить при помощи своего браузера или скрипта - это его человека дело, он на своей машине, а вы на своей, он не указывает как вам сервер организовывать, а вы не навязывайте ему клиентские решения. В общем полный расцвет либеральных идей :)
Поэтому и помогаем пока человек не говорит, я хочу украсть информацию, выложить и выдать как свою, очень денег нужно, а мне не только словами запрещают, но и всячески мешают... т.е. все честные, белые и пушистые до тех пор, пока сами не признаются в обратном. Т.е. в самой "обдирке" сайта ничего противозаконного нет, противозаконное начинается, когда результаты не для себя, а для других, а владельцы - против. | |
|
|
|
|
|
|
|
для: cheops
(15.05.2012 в 14:25)
| | Пока не признается. А какая разница признался сам или "и так понятно". И даже если признается.... И дело даже не в том, что ТУТ ПОМОГАЮТ. Ну не помогут тут - помогут в другом месте. И даже если конкретно Вы не поможете или я не помогу, всерн найдется кто-то другой.... И он поможет не ради помощи, а из спортивного интереса.... Скучно, нечем заняться, а тут ребус подкидывают. Интересно ведь? =) Бороться средствами "не помогания" с этим бесполезно. И я это никому не в упрек сказал. Просто констатировал факт =) | |
|
|
|
|
|
|
|
для: 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:
//Если пользователь подставил свое значение ил нечего не выбрал.
}
?>
|
| |
|
|
|
|
|
|
|
для: Гавриленко Дмитрий
(15.05.2012 в 21:39)
| | Это слишком раздуто.
Если значения чинно в ряд, достаточно проверки после int на ноль и не более.
Если значения списков, чекбоксов, радиокнопок, и др., это ключи таблиц, и не обязательно упорядоченных, то лучше хранить на время сеанса слепок этих ключей как массив, с которыми будет легко сравнить пришедшие. | |
|
|
|
|
|
|
|
для: confirm
(16.05.2012 в 03:47)
| | А вообще, можно ли каким то образом подставить своё значение в список SELECT не зная его "name".? | |
|
|
|
|
|
|
|
для: sega_z
(16.05.2012 в 10:42)
| | Как можно не знать имя, если вы его отдаете клиенту? | |
|
|
|
|
|
|
|
для: confirm
(16.05.2012 в 11:01)
| | А где именно оно отображается?
php код ведь не отображается у клиента. | |
|
|
|
|
|
|
|
для: sega_z
(16.05.2012 в 11:36)
| | Тяжелый случай. Что делает ваш php-код, как не "рожает" html страницу, которая таки будет отдана пользователю. Так? А любой браузер позволяет просмотреть исходный код страницы. А если можно просмотреть код страницы, то будет ли тайной для пользователя имена полей формы? | |
|
|
|
|
|
|
|
для: confirm
(16.05.2012 в 11:38)
| | Да, действительно, все имена полей видно в исходном коде страниц... | |
|
|
|