За последние 24 часа нас посетили 17959 программистов и 1604 робота. Сейчас ищут 1328 программистов ...

Важно: Ограничение доступа к MySQL для подключаемого кода

Тема в разделе "PHP и базы данных", создана пользователем X-Cray, 1 янв 2009.

  1. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Пусть имеется некоторая система на php, к которой можно подключать модули.
    Каждый подключаемый модуль - php класс.

    Система, естественно, подключается к mysql обычным mysql_connect, при этом все следующие mysql_query будут использовать созданное единственное соединение автоматически.

    Проблема: ограничение прямого доступа к mysql для подключаемых модулей.

    Т.е. необходимо сделать так, чтобы вызов функции mysql_query внутри подключенного модуля не давал возможности выполнить какой-либо SQL-запрос, используя созданное системой подключение.

    Есть какой-нибудь вариант локализации действия mysql_connect (за исключением mysql_close перед подключением модуля)?

    Или, быть может, реально сделать так?:
    • система подключилась к MySQL;
    • id подключения для использования в "своих" SQL-запросах был сохранен в защищенной переменной;
    • затем сделать что-нибудь магическое, чтобы все последующие mysql_query не могли работать без явного указания идентификатора подключения к mysql.
     
  2. Нет.
    Нет.
     
  3. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Когда работаешь с php, любое "нет" необходимо учиться читать как "нет, но если извратиться - то можно". :wink:

    Итак, учимся читать мануалы и извращаться:

    В функциях mysql есть некий страшный параметр link_identifier:

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

    PHP:
    1. <?
    2. $cs1=mysql_connect('localhost','root','pass', 'test', true); // создаем первое подключение
    3. $cs2=mysql_connect('localhost','root','pass', 'test', true); // сразу же создаем второе подключение
    4. mysql_close($cs2); // и тут же его закрываем
    5.  
    6. echo "<b>Я хорошая часть кода!</b><br>";
    7.  
    8. mysql_select_db('test', $cs1); // используя настоящее подключение выбираем БД
    9.  
    10. $res = mysql_query("SELECT * FROM `test`", $cs1); // делаем из нее выборку (указывая id правильного подключения)
    11. while ($a = mysql_fetch_array($res)) // забираем результат
    12. echo print_r($a,1)."<br>"; // и выводим
    13.  
    14. echo "<b>А я потенциально опасный модуль!</b><br>";
    15.  
    16. $res = mysql_query("SELECT * FROM `test`"); // а теперь пробуем сделать выборку без явного указания id подключения
    17. if (!$res) // проверяем результат mysql_query
    18. echo "Error"; // а дальше комментировать не имеет смысла. Ибо будет Error, как я и хотел.
    19. else
    20. while ($a = mysql_fetch_array($res))
    21. echo print_r($a,1)."<br>";
    22. ?>
    Вывод кода:
    Примечание: на сервере не должно существовать доступа к БД без пароля от имени пользователя root, т.к. не найдя рабочего подключения к БД, функция mysql_query попытается создать его от имени пользователя root.

    Последний параметр true в mysql_connect - это bool $new_link, который необходимо выставить в единицу, чтобы было создано новое соединение, не смотря на то, что его параметры совпадают с уже созданным.

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

    Что я получил от этого:
    Ограничение доступа к MySQL для модулей, написанных для CMS сторонними разработчиками.
    Предоставляя ограниченный функционал через быстрый API ядра цмс-ки, автор системы может не бояться за mysql-криворукость разработчиков модулей и наличие в них sql-уязвимостей, т.к. ущерб будет локализован областью влияния модуля.
     
  4. Поздравляю вас. Вы мужественно решили проблему, которую придумали себе сами.
     
  5. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Просто думал, что мне здесь помогут быстрее, чем пока я буду сам ковыряться :)
     
  6. А зачем давать неправильный ответ на неправильный вопрос?
     
  7. Ошибка вашего вопроса тут. Вы принимаете за «естественное» то, что естественным не является. И уж тем более, не является естественным в ключе вашей задачи.
     
  8. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Не будем обсуждать мимо темы,))
    Да. Используется ADODB или подобный фреймворк. Но вопрос от этого не меняется - mysql_query при drive=mysql в ADODB все равно будет работать.
     
  9.  
  10. Ответ этого тоже не поменяется, не нужно пользоватся mysql_* функциями.
    Однако, упорствовать в своем заблуждении — ваше исключительное право. Засим, откланяюсь.
     
  11. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Авторам модулей скажи :D именно от их криворукости я спрашивал защиту.)