Форма ввода со скрытым полем, как ее защитить

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

Таблица SQL (id, name, jod, number)

CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL auto_increment, `name` varchar(255) default '0', `job` varchar(255) default NULL, `number` varchar(255) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Код формы (элемент поддержки отредактирует собственную информацию)

 <form action="send.php" method="post" name="send" id="send"> <input type="text" name="name" id="name" value="John"/> <input type="text" name="job" id="job" value="Plumber"/> <input type=hidden name="number" id="number" value="1234"/> <input type="Submit" name="Submit" value="Submit"/> </form> 

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

введите описание изображения здесь

Это расширение работает следующим образом: оно может подделывать входные данные перед передачей на сервер.

введите описание изображения здесь

PHP Code Send.php

 if(isset($_POST['send'])){ $name = mysql_real_escape_string($_POST[name]); $job = mysql_real_escape_string($_POST[job]); $number = mysql_real_escape_string($_POST[number]); $sql= "update users SET name='$name',job='$job' WHERE number='$number'"; mysql_query($sql) or die("query failed: $sql".mysql_error()); echo "Update Done"; } else { echo "Nothing to update"; } 

Вопрос: Как тогда защитить эту простую форму от такой входной формы? ~ Спасибо

эти проблемы действительно больно, потому что это сделало мой сайт бесплатным для взлома 🙂

Solutions Collecting From Web of "Форма ввода со скрытым полем, как ее защитить"

Если авторизация пользователя не является выбором в вашей причине, вы можете попробовать следующие методы:

  • Установите скрытое поле с хешем номера, заправленного некоторой другой информацией
  • Установите скрытое поле с номером, зашифрованным (возможная соль также может повысить безопасность)

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

Вы не можете контролировать, какие данные люди представляют на ваш сервер.

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

Например:

способный редактировать значение скрытого номера таблицы для любого значения, такого как value = "1", в результате чего информация об обновлении для члена имеет это значение номер 1.

Процесс будет примерно таким:

  1. Разрешено ли кому-либо редактировать это поле? Если да, то ОК.
  2. Выполняется ли запрос от пользователя, прошедшего проверку подлинности? Если нет, верните сообщение об ошибке и форму входа в систему
  3. Запрос от пользователя с id = 1? Если да, то ОК
  4. Если запрос поступает от пользователя, у которого есть разрешения администратора? Если да, то ОК
  5. Верните сообщение об ошибке.

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

Кроме того, не используйте mysql_query или что-то вроде mysql_ *, они небезопасны и обесцениваются в php5.