Если я разрешу группе пользователей отправлять "explain $whatever"
в mysql (через DBI Perl с использованием DBD::mysql
), есть ли что-нибудь, что пользователь мог бы положить в $ все, что могло бы внести какие-либо изменения в базу данных, утечку нетривиальной информацииили даже вызвать значительную нагрузку на базу данных?Если да, то как?
Я знаю, что с помощью "explain $whatever"
можно выяснить, какие таблицы / столбцы существуют (хотя вы должны угадать имен) и примерно, сколько записей втаблица или сколько записей имеют конкретное значение для индексированного поля.Я не ожидаю, что кто-либо сможет получить какую-либо информацию о содержимом неиндексированных полей.
DBD::mysql
не должен разрешать множественные операторы, поэтому я не ожидаю, что можно будет выполнить любой запрос (простообъясните один запрос).Даже подзапросы не должны выполняться, просто объяснил.
Но я не эксперт по mysql, и, конечно, есть некоторые особенности mysql, о которых я даже не подозреваю.
В попытке прийтив соответствии с планом запроса, может ли оптимизатор фактически выполнить выражение, чтобы найти значение, с которым будет сравниваться индексированное поле?
explain select * from atable where class = somefunction(...)
, где atable.class
индексируется и не является уникальными class='unused'
не найдет записей, но class='common'
найдет миллион записей.Можно ли «объяснить» оценку somefunction(...)
?И тогда можно ли записать somefunction(...)
так, чтобы он изменял данные?