За последние 24 часа нас посетили 20015 программистов и 1000 роботов. Сейчас ищут 308 программистов ...

Как безопасно удалять БД и пользователей при клике на ссылку?

Тема в разделе "PHP для новичков", создана пользователем redcap, 2 дек 2016.

  1. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    Здравствуйте! Как присвоить значение переменной, в зависимости от того, какая ссылка нажата? Ссылки формируются из БД. Метод GET не интересует, т.к. небезопасен.
    Суть: скрипт удаляет пользователя и БД, как сделать так, чтобы никто не смог удалить чужую БД?
    PHP:
    1. $delete = $_GET ['delete'];
    2. if (isset ($delete)) {
    3.   $deletedb = mysqli_query ($link, "DROP DATABASE $name;");
    4. $deleteuser = mysqli_query ($link, "DROP USER '$name'@'localhost';")
    5. echo "<br>База данных успешно удалена";
    6. }
    Придумал такой способ проверки:
    PHP:
    1. $user = 'u1'; if (isset ($delete)
    2. ) {     $check = mysqli_query ($link, "SELECT userid FROM db WHERE name = '$delete'");
    3.  $arr = mysqli_fetch_array ($check);
    4. $db = $arr['userid'];    
    5. if ($db = $user) {        
    6. $dropuser = mysqli_query ($link, "DROP USER '$delete'@'localhost'");        
    7. $dropdb = mysqli_query ($link, "DROP DATABASE $delete;");    
    8. }
    9. }
     
    #1 redcap, 2 дек 2016
    Последнее редактирование: 2 дек 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Зачем удалть базу? Может записи достаточно?
    Проверить какой пользователь запрашивает удаление и если это невладелец записи, то не удалять.
    https://ru.wikipedia.org/wiki/Аутентификация
    https://ru.wikipedia.org/wiki/Авторизация
    https://ru.wikipedia.org/wiki/ACL
    https://en.wikipedia.org/wiki/Role-based_access_control
     
  3. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    Нет. Нужно именно удаление всей базы данных, а не записи.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    @redcap создай отдельную базу и в ней в таблице веди учёт чьи другие базы, чтобы можно было проверить
     
  5. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    Такая таблица в отдельной БД есть - содержит 3 колонки: уникальный ID базы, имя базы данных (имя пользователя БД и имя БД совпадают) и какому пользователю принадлежит БД.
    --- Добавлено ---
    PHP:
    1. // имя (ID) текущего пользователя скрипта
    2. $user = 'u1';
    3. //если переменная delete выбрана
    4. if (isset ($delete)
    5. {    //делаем запрос к БД (определяем пользователя базы данных, которая подлежит удалению)
    6. $check = mysqli_query ($link, "SELECT userid FROM db WHERE name = '$delete'");
    7. //формируем массив из этого запроса
    8. $arr = mysqli_fetch_array ($check);
    9. //получаем имя (ID) владельца БД в виде переменной
    10. $db = $arr['userid'];  
    11. //если владелец БД и текущий пользователь скрипта совпадают
    12. if ($db = $user) {      
    13. //удаляем mysql пользователя
    14. $dropuser = mysqli_query ($link, "DROP USER '$delete'@'localhost'");      
    15. //удаляем БД
    16. $dropdb = mysqli_query ($link, "DROP DATABASE $delete;");  
    17. }
    18. }
     
  6. Fedorov_Dima

    Fedorov_Dima Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    2
    Симпатии:
    2
    @redcap для каких интересно задач требуется создание индивидуальных баз для каждого пользователя?)
    Вы хостинг-провайдер?
     
  7. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    Да.
     
  8. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    В результате получился такой код для страницы авторизации:
    HTML:
    1. <form method = "post">
    2.     <span>Логин</span>
    3.    <br> <input type = "text" name = "login">
    4. <br>    <span>Пароль</span>
    5.    <br> <input type = "text" name = "pass">
    6.   <br> <input type = "submit" name = "dologin" value = "Войти">
    7. </form>
    PHP:
    1. <?php
    2.  //запускаем сессию, где будут храниться данные о статусе авторизации пользователя: авторизован, или нет
    3. //получаем логин из формы
    4. $login = $_POST['login'];
    5.  //получаем уже захэшированный пароль из формы
    6. $pass = md5($_POST['pass']);
    7. //если обе переменные выбраны, то
    8. if (isset ($login,$pass)) { //подключаемся к базе данных, где хранятся логины пользователей и хэши их паролей
    9.  $link = mysqli_connect('localhost', '***', '***', '***');
    10. //получаем логин пользователя из БД
    11. $check = mysqli_query ($link, "SELECT login FROM 'users_kp' WHERE login = '$login' AND WHERE pass = '$pass'");
    12. //создаём ассоциативный массив из этого запроса
    13. $checkarr = mysqli_fetch_array ($check);
    14. //выводим логин в переменную
    15. $userlogin = $checkarr['login'];
    16. // если логин из БД и логин из формы совпадают, то
    17. if ($userlogin==$login) {    
    18. //пользователь авторизован    
    19. $authorized ='yes';    
    20. //сохраняем значение переменной в сессию    
    21. $authorized = $_SESSION['authorized']; } } ?>
     
    #8 redcap, 3 дек 2016
    Последнее редактирование: 3 дек 2016
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    @redcap значит задача решена?

    @redcap для организации хостинга есть же ISPmanager, CPanel и т. д., почему не взять их?
     
  10. redcap

    redcap Новичок

    С нами с:
    16 ноя 2016
    Сообщения:
    21
    Симпатии:
    1
    Про ISPManager/CPanel/VestaCP/Parallels Plesk и другие панели знаю. На данный момент использую ISPManager 5 Lite, но он платный, и, на мой взгляд, не очень удобный в плане интерфейса.
    Задача пока не решена, буду тестировать, ещё надо дописать проверку на страницах панели.
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Вот эти две строки смущают. Если я не ошибаюсь, то переменная $delete будет существовать в любом случае, а её значение будет зависеть от существования $_GET['delete']. Разве нет?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    В yii2 эта проблема решается javascript-ом, который заставляет ссылки открывать методом post, и туда добавляется просто CSRF-токен