За последние 24 часа нас посетили 62143 программиста и 1793 робота. Сейчас ищет 861 программист ...

Взлом данных!

Тема в разделе "PHP для новичков", создана пользователем Roma_SP, 12 дек 2013.

  1. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Столкнулся с проблемой: взлома данных и изменения данных с моего сайта. Сайт не особо популярен, но хранит эксклюзивные данные. Некоторые данные хранятся в БД, а остальные выложены на сайте. Хостинг простой. Вход в сам сайт только через логин и пароль, кешировал через md4 и sha256. Понимаю что нужно выбирать хороший хостинг. КТО СКАЖЕТ, КАК МОЖНО ЗАЩИТИТЬ СВОЙ САЙТ ОТ ВЗЛОМА И РЕДАКТИРОВАНИЯ ДАННЫХ ИЗ САМОГО САЙТА И БД???
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    инъекции...
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    покажите любой кусок кода где вы делаете запрос к БД.
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    часто вебмастера про*ают доступ FTP.

    Roma_SP, ты какой программой файлы выкладываешь на хостинг? пароль всякий раз вводишь или он сохранен?
     
  5. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Я выкладывал на хостинг: hostinger, там без всяких программ можно выложить сайт.

    Добавлено спустя 2 минуты 12 секунд:
    обычный запрос: $result = mysql_query("SELECT * FROM mybd WHERE login='$login'",$db);
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    то есть через веб-интерфейс. понятно.

    а переменная $login как создается?
     
  7. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    а переменная $login как создается?[/quote]



    После регистрации, как ввели логин и пароль попадает на страницу,логин проверяется как и пароль.[/quote]
    $login = $_SESSION['login'];
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    покажи как в $_SESSION['login'] попадает значение. ты еще не догадался к чему я тебя подвожу?
     
  9. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Методом post отправляется в страницу проверки, потом переводится в саму страницу.
    В проверке проверяем правильно ли введен логин и пароль,обрабатываю их, чтобы теги и скрипты не работали и удаляем лишние пробелы
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    скорее всего вот тут ты допустил промах и сам догадываешся об этом. поэтому код не показываешь. тебя УЖЕ сломали, давай выкладывай!

    Добавлено спустя 1 минуту 11 секунд:
    давай всё — и проверки и как ты после SELECT … WHERE login=… авторизуешь пользователя.
     
  11. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    давай всё — и проверки и как ты после SELECT … WHERE login=… авторизуешь пользователя.

    Вот код:


    session_start();
    if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
    if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }

    if (empty($login) or empty($password))
    exit ("Вы ввели не всю информацию, венитесь назад и заполните все поля!");
    }
    $login = stripslashes($login);
    $login = htmlspecialchars($login);

    $password = stripslashes($password);
    $password = htmlspecialchars($password);

    $login = trim($login);
    $password = trim($password);

    include ("bd.php");

    $ip=getenv("HTTP_X_FORWARDED_FOR");
    if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
    mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");
    $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
    $myrow = mysql_fetch_array($result);

    if ($myrow['col'] > 2) {
    exit("Вы набрали логин или пароль неверно 3 раз. Подождите 15 минут до следующей попытки.");
    }
    $password = md5($password);
    $password = strrev($password);
    $password = $password."b3p6f";



    $result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'",$db);
    $myrow = mysql_fetch_array($result);
    if (empty($myrow['id']))
    {
    $select = mysql_query ("SELECT ip FROM erroroshibka WHERE ip='$ip'");
    $tmp = mysql_fetch_row ($select);
    if ($ip == $tmp[0]) {
    $result52 = mysql_query("SELECT col FROM error WHERE ip='$ip'",$db);
    $myrow52 = mysql_fetch_array($result52);
    $col = $myrow52[0] + 1;
    mysql_query ("UPDATE error SET col=$col,date=NOW() WHERE ip='$ip'");
    }
    else {
    mysql_query ("INSERT INTO error (ip,date,col) VALUES ('$ip',NOW(),'1')");
    }

    exit ("Извините, введённый вами логин или пароль неверный.");
    }
    else {
    nbsp;
    $_SESSION['password']=$myrow['password'];
    $_SESSION['login']=$myrow['login'];

    $_SESSION['id']=$myrow['id'];

    }}
    echo "<html><head><meta http-equiv='Refresh' content='0; URL=index.php'></head></html>";
    ?>
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну блин, а что ж ты хочешь :D ты ж нигде не защищаешь бд
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    stripslashes вообще не нужна. это из старых версий PHP и старых книжек тянется…

    htmlspecialchars поможет от инъекции тегов HTML, в т.ч. <script>. для наглядности лучше использовать ПРИ ВЫВОДЕ, а не при сохранении.

    от SQL-инъекций у тебя нет ничего. наверное так тебя и взломали

    Добавлено спустя 8 минут 2 секунды:
    смотри фрагмент:
    Код (PHP):
    1. $result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'", $db); 
    допустим у тебя есть пользователь admin, если я введу в поле login такое
    admin' -- o_O
    а пароль что угодно, например
    123456
    строка запроса будет выглядеть так:
    SELECT * FROM users WHERE login='admin' -- o_O' AND password='md5otpasswordplusololo'
    всё, что правее "--" это комментарий MySQL и просто игнорируется
    так я войду как пользователь admin!

    проблема лечится просто: перед запросом делай mysql_real_escape_string для всех подставляемых переменных

    p.s. а вообще пора от расширения mysql отказываться и использовать mysqli или PDO. там, кстати, ты можешь использовать родные плейсхолдеры чтобы всё автоматически экранировалось.
     
  14. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Можно подробнее и есть ли полный пример? И если я ввожу как admin'-- и пароль 123456, то выводит6
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in proverka.php on line 55

    Добавлено спустя 6 минут 31 секунду:
    Ну у меня же база в хостинге, там проверяется логин и пароль или лучше сделать защиту? и как?
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ок, я внес поправку: между "--" и тем что далее должен быть хотябы один пробел, иначе MySQL не считает это комментарием.

    Добавлено спустя 2 минуты 41 секунду:
    мой тестовый скрипт чтобы убедиться в бесполезности твоих "защит":
    Код (PHP):
    1. <?php
    2.  
    3. $login = "admin' -- o_O";
    4. $password = '123456';
    5.  
    6. $login = stripslashes($login);
    7. $login = htmlspecialchars($login);
    8.  
    9. $password = stripslashes($password);
    10. $password = htmlspecialchars($password);
    11.  
    12. $login = trim($login);
    13. $password = trim($password);
    14.  
    15. echo "SELECT * FROM users WHERE login='$login' AND password='$password'";
    16.  
    выводит
    Код (Text):
    1. SELECT * FROM users WHERE login='admin' -- o_O' AND password='123456'
    эта строка прекрасно кушается MySQL и действует как задумано
     
  16. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    То есть нужно просто: $result = mysql_real_escape_string("SELECT * FROM users WHERE login='$login' AND password='$password'", $db);
     
  17. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    БЛИН!!! НЕ ВЕСЬ ЗАПРОС!!!
    нужно $login = mysql_real_escape_string($login) и то же с password и любыми переменными, которые ты вклеиваешь в строку запроса.
     
  18. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    похоже так и вошли...а можешь более подробно рассказать как лучше всего защитить или дать ссылку на материал...

    Добавлено спустя 41 секунду:
    Спасибо большое!!!
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ссылку на документацию я давал! там все нужные примеры есть. читай всё!!! там есть важные предостережения.
     
  20. Roma_SP

    Roma_SP Новичок

    С нами с:
    11 сен 2013
    Сообщения:
    89
    Симпатии:
    0
    Спасибо ознакомлюсь!!!