Динамические SQL-запросы с именами почтовых ключей - PullRequest
1 голос
/ 02 июля 2010

Плохо называть мои поля формы такими же, как имена моих столбцов?Я имею в виду, действительно ли люди это делают:

 <?php
 $id = intval($_POST['user_unique_key']);
 $name = mysql_real_escape_string($_POST['name_of_user']);
 $email = mysql_real_escape_string($_POST['user_mail_thing']);
 $address = mysql_real_escape_string($_POST['user_place_of_living']);
 //....
 $sql = "INSERT INTO `users`('id','name','email','address') VALUES($id,$name,$email,$address)"
 ?>

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

<a href="http://forums.devnetwork.net/viewtopic.php?f=50&t=118175">My Data Validation</a>

Должен ли я использовать префикс таблицы вроде: 'secret_prefix _'?

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

 <?php echo $field_name = base64_encode(mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $key, $key, MCRYPT_MODE_ECB, $iv ));?>

, а затем расшифруйте имя поля, как только оно будет опубликовано

 <?php
  foreach($_POST as $name=> $value)
  {
  $input[base64_decode(mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $name, MCRYPT_MODE_ECB, $iv ))] = $value;
  }?>

Ответы [ 3 ]

1 голос
/ 02 июля 2010

Неправильно ли называть мои поля формы такими же, как имена столбцов?

Краткий ответ: Не всегда , изменение имен столбцов /базы данных / таблицы могут сделать приложение более устойчивым к атакам, если ваша база данных настроена правильно.По умолчанию злоумышленник может получить эти данные, если у него есть SQL-инъекция, потому что это не имеет значения, если вы дадите им это.

Если вы хотите скрыть эти имена, вы также должны отозвать доступ к базе данных INFORMATION_SCHEMA:

REVOKE SELECT ON INFORMATION_SCHEMA.* TO mysql_app_user

И вот причина:

Обычная атака SQL-инъекций - это выбор сочных данных из другой таблицы.В MySQL вы не можете "составлять запросы", как в (вставьте в ...; выберите * из ...; предоставьте ...).Таким образом, вы должны использовать «союз выбора».

Например:

mysql_query("select path,type from images where id=".$_GET[id]);

Соответствующий эксплойт выглядит следующим образом:

http://localhost/sql_inj.php?id=0 union select username,password from users where id=1

В этом случае первыйоператор выбора будет пустым, ни один первичный ключ не будет равен нулю.2-й оператор выбора выберет username и password из таблицы user в той же базе данных, это захватит первичный ключ 1, который в 99% случаев составляет администратор .Чтобы это осуществить, вам нужно знать EXACT имя таблицы и нужные вам столбцы.

Ну, в mysql есть база данных information_schema, предоставляющая эти данные.Таким образом, если имена столбцов и баз данных скрыты, они все равно могут быть получены с помощью следующего:

http://localhost/sql_inj.php?id=0 union select COLUMN_NAME,"junk" from FROM INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME like "%user"

Этот запрос отменит любой префикс безопасности.Однако эту же атаку можно использовать для получения ALL столбцов, базы данных и таблиц в базе данных MySQL.Если вы отмените права выбора для учетной записи пользователя mysql веб-приложения, он не сможет этого сделать.Вам также следует отозвать привилегии FILE, так как они могут использоваться для загрузки бэкдора или чтения файлов конфигурации.

0 голосов
/ 02 июля 2010

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

  1. Фильтрация (например, использование intval())
  2. Проверка
  3. Экранирование (если вы интерполируете контент в SQLстроки)
  4. Подготовленные запросы с использованием параметров (вам нужно использовать ext / mysqli или ext / pdo_mysql)

Тем не менее, запутывание имен полей не повредит.Я бы не стал использовать крайний пример хэширования имен столбцов.Это ненужный расход.Вы хотите вызывать хэш-функции для кодирования имен столбцов при каждом создании формы и декодирования имен полей POST при каждой обработке формы?

Вам даже не нужно запутывать каждое имя поля формы взаказ на запутывание для достижения своего эффекта.Если даже некоторые ваших полей формы не соответствуют именам столбцов базы данных, то злоумышленник не будет знать, какие из них соответствуют, а какие нет!: -)

0 голосов
/ 02 июля 2010

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

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

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