Неправильно ли называть мои поля формы такими же, как имена столбцов?
Краткий ответ: Не всегда , изменение имен столбцов /базы данных / таблицы могут сделать приложение более устойчивым к атакам, если ваша база данных настроена правильно.По умолчанию злоумышленник может получить эти данные, если у него есть 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
, так как они могут использоваться для загрузки бэкдора или чтения файлов конфигурации.