За последние 24 часа нас посетили 18538 программистов и 1670 роботов. Сейчас ищут 885 программистов ...

Запрос к данным из базы MySql, взломы.

Тема в разделе "PHP и базы данных", создана пользователем SIR2100, 21 ноя 2012.

  1. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    У меня есть скрипт, заносящий в базу данных некие данные.
    К нему доступ есть только когда пользователь авторизован, т.е. активна переменная 'user'.
    В обработчике стоит условие, если юзер, то пишем, или ошибка. Так вот. Можно ли как-либо обойти этот запрос? Т.е. не будучи юзером отправить или посмотреть данные таблицы? Если да, то как? И как это исправить.
    Сразу спасибо всем тем, кто помогает =)
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    скрипт в студию

    Добавлено спустя :
    скрипт в студию
     
  3. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Код (PHP):
    1. <?php session_start();?>
    2. <html>
    3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    4. <body>
    5. <?php
    6. include ("../settings.php");
    7. $my_id=$_SESSION['id'];
    8. $query = "SELECT post FROM `users` where id='$my_id'";
    9. $res =  mysql_query($query);
    10. $row = mysql_fetch_row($res);
    11. if ($row[0] == 'admin')
    12.     {
    13. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } 
    14. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    15. if (isset($_POST['name'])) { $name=$_POST['name']; if ($name =='') { unset($name);} }
    16. if (isset($_POST['surname'])) { $surname=$_POST['surname']; if ($surname =='') { unset($surname);} }
    17. if (isset($_POST['post'])) { $post=$_POST['post']; if ($post =='') { unset($post);} }
    18.  
    19. if (empty($login) or empty($password)or empty($name)or empty($surname)or empty($post))
    20. {
    21. exit ("Вы ввели не всю информацию, венитесь назад и заполните все поля!");
    22. }
    23. $login = stripslashes($login);
    24. $login = htmlspecialchars($login);
    25.  
    26. $password = stripslashes($password);
    27. $password = htmlspecialchars($password);
    28.  
    29. $name = stripslashes($name);
    30. $name = htmlspecialchars($name);
    31.  
    32. $surname = stripslashes($surname);
    33. $surname = htmlspecialchars($surname);
    34.  
    35. $post = stripslashes($post);
    36. $post = htmlspecialchars($post);
    37.  
    38. //удаляем лишние пробелы
    39. $login = trim($login);
    40. $password = trim($password);
    41. $name = trim($name);
    42. $surname = trim($surname);
    43. $post = trim($post);
    44.  
    45. // проверка на существование пользователя с таким же логином
    46. $result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
    47. $myrow = mysql_fetch_array($result);
    48. if (!empty($myrow['id'])) {
    49. exit ("Введённый вами уникальный ID уже состоит в нашей базе данных. Введите другой ID.");
    50. }
    51.  
    52. $result = mysql_query ("INSERT INTO users (login,password,name,surname,post) VALUES('$login','$password','$name','$surname','$post')");
    53. // Проверяем, есть ли ошибки
    54. if ($result=='TRUE')
    55. {
    56. echo "Пользователь с этими данными успешно создан <a href='../index.php'>Вернуться назад</a>";
    57. }
    58.  
    59. else {
    60. echo "Ошибка при сохранении данных!";
    61.      }
    62.     }
    63. else
    64. {
    65.         echo'Обнаружена попытка взлома! Иди гуляй, маленький хакер!';
    66.         exit;
    67. }
    68. ?>
    69. </body>
    70. </html>
    Весь файлик
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Как сюда $_SESSION['id']; попадает значение? откуда? где?
     
  5. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    При авторизации мы сравниваем логин и пароль. Если подходит, лезем в бд и трах тарарах $_SESSION['id']=$myrow['id']; =) а потом таскаем за собой по сайту до того времени, как юзер не разлогинится.
    $myrow['id'] - берем данные из MySql
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    $_SESSION['id']=$myrow['id']
    в $myrow['id'] может содержаться инъекция =) в $query = "SELECT post FROM `users` where id='$my_id'";
    надо смотреть тот запрос, которым это значение вытаскивается.
    дальше едем.
    $row = mysql_fetch_row($res);
    не проверяешь, есть ли эти самые строки вобще. может там ноль строк в ответе.

    $result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
    опять дыра
     
  7. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Ну вот, дуршлак((

    Добавлено спустя 15 минут 43 секунды:
    1) Фильтруем $myrow['id'] на всякие символы. Вроде так.
    2) Что плохого в $query = "SELECT post FROM `users` where id='$my_id'"; и в $result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
    - я не пойму. Наверное, потому что пинек.
    3) $row = mysql_fetch_row($res); - проверяем на наличие хоть чего-нибудь в переменной.

    Вот насчет второго я не понял. Можешь подробнее объяснить, что и как?
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    1 - ты нигде ничего не фильтруешь
    2 - плохого то, что данные из $my_id, которые попали туда из $_SESSION['id'], которые попали туда из "Если подходит, лезем в бд и трах тарарах" не проверяются НИКАК и не экранируются и прочая и прочая. =)

    3 - ты не проверил, есть ли строки вообще и уже фетчишь.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    инъекция. откуда берется $login? из пользовательского ввода:
    Код (Text):
    1. $login = $_POST['login']
    (а оно вообще есть в тот момент когда ты в запрос подставляешь? что-то тут не то, я чувствую)


    вот это НЕ защита, это вообще из другой оперы приползло:
    Код (Text):
    1.     $login = stripslashes($login);
    2.     $login = htmlspecialchars($login);
    если используешь расширение mysql, экранируй строки mysql_real_escape_string()

    Добавлено спустя 4 минуты 4 секунды:
    для общего развития:
    stripslashes() это историческое недоразумение. просто выкини это говно, если на твоем сервере PHP 5.2+
    htmlspecialchars() предназначен для нейтрализации тегов HTML и всяких "опасных" символов при выводе текста на страницу. от внедрения javascript например поможет. к базе данных это неприменимо никак.

    Добавлено спустя 9 минут 28 секунд:
    с логикой что-то вообще никак.
    если это админ, то получаем кучу POST-переменных… сделай там перед этим
    Код (PHP):
    1. if ($row[0] != 'admin') die('Где настоящий admin, блеать?'); 
    2. if ($_SERVER['REQUEST_METHOD'] != 'POST') die('Где данные формы, блеать?'); 
    сэкономишь много процессорных калорий
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и то не спасение, как известно :D
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    опять двадцать пять. не yebi парню мозг.

    про экранирование из прошлых тем: ТЫЦ и ТЫЦ
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а че, ты открыл мне глаза на одну дырку. =) прости за такую пошлость. теперь я обрёл истину, и знаю как пробить риалэскейп при определённых обстоятельствах. круто чо.
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    на здоровье! всегда рад.
    обстоятельства — наше всё
     
  14. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Во блин, пугают тут меня своими страшными историями..(( Сбегу из сайтостроения xDDD
    Шучу)) Будем работать над знаниями в своей шкатулке)) Всем спасибо за помощь =)

    Добавлено спустя 8 минут 53 секунды:
    Вот сам обработчик при авторизации.
    Т.е. из полей авторизации идем сюда
    Код (Text):
    1. <?php session_start(); ?>
    2. <html>
    3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    4. <body>
    5. <?php
    6. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    7. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    8.  
    9. if (empty($login) or empty($password))
    10. {
    11. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    12. }
    13.  
    14. $login = stripslashes($login);
    15. $login = htmlspecialchars($login);
    16. $login = trim($login);
    17.  
    18. $password = stripslashes($password);
    19. $password = htmlspecialchars($password);
    20. $password = trim($password);
    21.  
    22. include ("settings.php");
    23.  
    24. $result = mysql_query("SELECT * FROM users WHERE login='$login'",$db);
    25. $myrow = mysql_fetch_array($result);
    26. if (empty($myrow['password']))
    27. {
    28. exit ("Извините, пользователя с данными ID и/или паролем не существует.");
    29. }
    30. else {
    31.           if ($myrow['password']==$password) {
    32.           $_SESSION['login']=$myrow['login'];
    33.           $_SESSION['id']=$myrow['id'];
    34.           echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>";
    35.           }
    36.  
    37.        else {
    38.        exit ("Извините, введенные Вами данные не верны.");
    39.        }
    40. }
    41. ?>
    42. </body>
    43. </html>
    Добавлено спустя 17 минут 43 секунды:
    Прочитал, что mysql_real_escape_string() - "средство от всех болезней", связанных с MySql. Так ли это?
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. но без неё и кавычек вобще ни-ни.
     
  16. LeXXXX35

    LeXXXX35 Активный пользователь

    С нами с:
    30 сен 2010
    Сообщения:
    41
    Симпатии:
    0
    что то у тебя тут прям много слишком ))))) не проще ли так:
    Код (Text):
    1. $password=mysql_real_escape_string(trim($_POST['password']));
    Надеюсь ты пароли хранишь в БД в зашифрованном виде?)))
     
  17. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Из скрипта видно, что нет.
    У меня еще назревает вопрос. Как зашифровать все личные данные? Причем не так как пароль, md5, а чтобы их потом можно было прочесть. Хотя тогда смысл шифровки теряется, есть расшифраторы.
    А так, скриптик пока тестирую, занимаюсь отладкой. Сделается шифрование.

    Добавлено спустя 3 минуты 58 секунд:
    Так она же и кавычки убивает? Или ты про отключение "Магических кавычек"?
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в запросе долно быть всё в кавычках, где текст. Имена таблиц и полей в обратных `, а значения в прямых ' или ".
     
  19. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Код (Text):
    1. <?php session_start(); ?>
    2. <html>
    3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    4. <body>
    5. <script type="text/javascript">  
    6.  location.replace("http://site.ru");  // Проходим "Мимо" авторизации, незаметно для пользователя
    7. </script>
    8. <?php
    9.  
    10. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    11. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    12.  
    13. if (empty($login) or empty($password))
    14. {
    15. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    16. }
    17. $login=mysql_real_escape_string(trim($_POST['login']));
    18. $password=mysql_real_escape_string(trim($_POST['password']));
    19.  
    20. include ("settings.php");
    21.  
    22. $result = mysql_query("SELECT * FROM `users` WHERE `login`='$login'",$db);
    23. $myrow = mysql_fetch_array($result);
    24. if (empty($myrow['password']))
    25. {
    26. exit ("Извините, введённый вами логин или пароль неверный.");
    27. }
    28. else {
    29.           if (md5($myrow['password'])==$password) {
    30.           $_SESSION['login']=$myrow['login'];
    31.           $_SESSION['id']=$myrow['id'];
    32.           echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>";
    33.           }
    34.  
    35.        else {
    36.        exit ("Извините, введённый вами логин или пароль неверный.");
    37.        }
    38. }
    39. ?>
    40. </body>
    41. </html>
    Оцените теперь обработчик, этот для входа на сайт. Что еще в нем подправлять?
    P.s. Хотелось бы еще сделать sleep(1000), для усложнения работы брутфорса.
    И еще. Хотелось бы делить пароль на 2 части. К примеру, первая часть - 3 символа, вторая - остальные. Шифруем по отдельности обе части. Зашифрованное шифруем еще раз, получаем довольно защищенный вариант пароля.
    Вопрос в том, как отделить первые три символа пароля)) Ну соответственно и остальные

    Добавлено спустя 4 минуты 41 секунду:
    Ну и сразу)) У кого какие мысли по оптимизации может появились? По крайней мере у того, что я показал =)
    Буду очень благодарен =)
     
  20. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Код (Text):
    1. <?php session_start(); ?>
    2. <html>
    3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    4. <body>
    5. <?php
    6. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    7. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    8.  
    9. if (empty($login) or empty($password))
    10. {
    11. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    12. }
    13.  
    14. $login = mysql_real_escape_string($login);
    15. $password = mysql_real_escape_string($password);
    16.  
    17. include ("settings.php");
    18.  
    19. $result = mysql_query("SELECT * FROM `users` WHERE `login` = '$login'",$db);
    20. $myrow = mysql_fetch_array($result);
    21. if (empty($myrow['password']))
    22. {
    23.      exit ("Извините, пользователя с данными ID и/или паролем не существует. <a href='index.php'>Вернуться обратно</a>");
    24. }
    25. else {
    26.           echo'<script type="text/javascript">location.replace("./index.php");</script>';
    27.           if ($myrow['password']==$password) {
    28.           $_SESSION['login']=$myrow['login'];
    29.           $_SESSION['id']=$myrow['id'];
    30.           echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>";
    31.           }
    32.  
    33.        else {
    34.        exit ("Извините, введенные Вами данные не верны. <a href='index.php'>Вернуться обратно</a>");
    35.        }
    36. }
    37. ?>
    38. </body>
    39. </html>
    Что тут я делаю не так?
    Добавлено спустя 21 минуту 32 секунды:
    Ясен перец. Сначала нужно было к бд подключиться, а потом уже мацать переменные
     
  21. LeXXXX35

    LeXXXX35 Активный пользователь

    С нами с:
    30 сен 2010
    Сообщения:
    41
    Симпатии:
    0
    Знаешь, я бы немного изменил логику. У тебя авторизация основана на сессиях. Я бы сделал так:
    Код (Text):
    1. if (!isset($_SESSION['id']))
    2. { подключаем файл с формой авторизации }
    3. else
    4. { какие то другие действия доступные авторизованному пользователю}
    Далее сделал бы так:
    Сначала проверил в обработчике отправленные из формы пользователем данные:
    Код (Text):
    1. if (trim($_POST['login'])!=='')
    2. {
    3.     if (trim($_POST['password'])!=='')
    4.     {
    5.      //Тут уже можно произвести подключение к БД и начать проверку совпадения пары логин / пароль
    6.     {
    7.     else
    8.     { echo 'Введите пароль!'}
    9. }
    10. else
    11. { echo 'Введите логин!';
    Таким же путем можно проверить на количество вводимых знаков, например чтобы юзеры не вводили логины меньше 4 символов. А на стороне клиента проверять поля с помощью Javascript, для этого к примеру хорошо подойдет jQuery Validator http://bassistance.de/jquery-plugins/jquery-plugin-validation/ Посмотри там в разделе Demo есть примеры его работы.

    Добавлено спустя 7 минут 40 секунд:
    А на счет деления пароля на две части думаю это излишне. Хотя если хочешь, то вот так это можно сделать:
    Код (Text):
    1.  
    2. <?php
    3. $pass='1234567890';
    4. $part1=substr($pass, 0, 3); //первые три символа
    5. $part2=substr($pass, 3); // последующие символы
    6. echo $part1.$part2;
    7. ?>
    Еще можешь зашифровать вдвойне md5(md5($password)) или так sha1(md5($password))
    В общем методов много )))
     
  22. SIR2100

    SIR2100 Активный пользователь

    С нами с:
    16 ноя 2012
    Сообщения:
    19
    Симпатии:
    0
    Код (Text):
    1. <?php session_start(); ?>
    2. <html>
    3. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    4. <body>
    5. <?php
    6. if (!isset($_SESSION['id']))
    7. {
    8. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    9. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    10.  
    11. if (empty($login) or empty($password))
    12. {
    13.     exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля! <a href='index.php'>Вернуться обратно</a>");
    14. }
    15. else if((trim("$login")<>'') and (trim("$password")<>''))
    16. {
    17.     include ("settings.php");
    18.    
    19.     $login=mysql_real_escape_string(trim("$login"));
    20.     $password=mysql_real_escape_string(trim("$password"));
    21.    
    22.     $part1=substr("$password",0,2);
    23.     $part2=substr("$password",2,2);
    24.     $part1 = md5("fraze$part1");
    25.     $part2 = md5("fraze$part2");
    26.     $password = md5("$part1$part2");
    27.    
    28.     $result = mysql_query("SELECT * FROM `users` WHERE `login` = '$login'",$db);
    29.     $myrow = mysql_fetch_array($result);
    30.     if ($myrow['password']=="$password")
    31.     {
    32.         echo'<script type="text/javascript">location.replace("./index.php");</script>';
    33.         $_SESSION['login']=$myrow['login'];
    34.         $_SESSION['id']=$myrow['id'];
    35.         echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>";
    36.     }
    37.     else
    38.     {
    39.         exit ("Извините, введенные Вами данные не верны. <a href='index.php'>Вернуться обратно</a>");
    40.     }
    41. }
    42. }
    43. else
    44. {echo"Вы уже авторизованы! <a href='index.php'>На главную</a>";}
    45. ?>
    46. </body>
    47. </html>
    Сделал все что в голову пришло. Поправьте, если что не так))