2017-02-22 27 views
1

Я готовлю тест MySQL, где пользователь увидит небольшую базу данных, и мы покажем некоторые вопросы. Пользователь будет отвечать на вопросы как запросы. Он создаст запрос и запустит его и посмотрит, получит ли он желаемый результат.Как предотвратить изменение базы данных Mysql/обновление/удаление?

Все вопросы основываются на вопросах «выбрать». Поэтому перед запуском запроса я хочу подтвердить, что в запросе нет ничего, что изменит текущий статус базы данных. Пользователь не может явно запускать обновление, удаление, вставить и т. Д. Любые другие типы запросов, которые изменяют базу данных.

Как я могу это сделать? Есть ли какая-то библиотека, которая может мне помочь? В настоящее время я просто ищу ключевые слова для вставки, обновления и удаления в строке запроса, чтобы предотвратить это. Я использую PHP и codeigniter MVC.

+4

создать пользователь базы данных, которые не имели (удаление, обновление и т.д.) роль прикрепленный на ней , http://webmasters.stackexchange.com/questions/2242/how-to-create-separate-users-in-phpmyadmin-each-one-cant-see-others-databases –

ответ

2

Создать пользователя только с SELECT привилегией присвоенной ему нравится:

"GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password'; 

Теперь пользователь с username имеют только select привилегии.

1

Хотя вы можете ограничить действия на основе настроек, предоставленных пользователю, что предотвратит несанкционированные действия как безопасное решение, вы можете использовать preg_match для проверки наличия определенных определенных слов в запросе. Однако могут быть случаи, когда некоторые из этих слов могут использоваться в запросе SELECT, если вы нуждаетесь в них для текстового поиска =, LIKE, REGEX и т. Д.

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

Затем, если у вас есть строка, проверьте список запрещенных слов или фраз MySQL.

if(preg_match('/[alter|set|update|insert|delete|replace|into|grant]/',strtolower($query))) { 
    $bad_query = true; 
} 

Предоставлено это более сложное фактическое решение PHP. Самая безопасная ставка заключается в том, чтобы ограничить доступ к вашему MySQL-вызову, однако если ваша цель - проверить конкретный синтаксис - вы можете это сделать.

Для получения информации о параметрах GRANT и наборе команд каждый позволяет, вы можете использовать этот URL, как большой ресурс: https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

 Смежные вопросы

  • Нет связанных вопросов^_^