Столкнулся с проблемой: взлома данных и изменения данных с моего сайта. Сайт не особо популярен, но хранит эксклюзивные данные. Некоторые данные хранятся в БД, а остальные выложены на сайте. Хостинг простой. Вход в сам сайт только через логин и пароль, кешировал через md4 и sha256. Понимаю что нужно выбирать хороший хостинг. КТО СКАЖЕТ, КАК МОЖНО ЗАЩИТИТЬ СВОЙ САЙТ ОТ ВЗЛОМА И РЕДАКТИРОВАНИЯ ДАННЫХ ИЗ САМОГО САЙТА И БД???
часто вебмастера про*ают доступ FTP. Roma_SP, ты какой программой файлы выкладываешь на хостинг? пароль всякий раз вводишь или он сохранен?
Я выкладывал на хостинг: hostinger, там без всяких программ можно выложить сайт. Добавлено спустя 2 минуты 12 секунд: обычный запрос: $result = mysql_query("SELECT * FROM mybd WHERE login='$login'",$db);
а переменная $login как создается?[/quote] После регистрации, как ввели логин и пароль попадает на страницу,логин проверяется как и пароль.[/quote] $login = $_SESSION['login'];
Методом post отправляется в страницу проверки, потом переводится в саму страницу. В проверке проверяем правильно ли введен логин и пароль,обрабатываю их, чтобы теги и скрипты не работали и удаляем лишние пробелы
скорее всего вот тут ты допустил промах и сам догадываешся об этом. поэтому код не показываешь. тебя УЖЕ сломали, давай выкладывай! Добавлено спустя 1 минуту 11 секунд: давай всё — и проверки и как ты после SELECT … WHERE login=… авторизуешь пользователя.
давай всё — и проверки и как ты после 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>"; ?>
stripslashes вообще не нужна. это из старых версий PHP и старых книжек тянется… htmlspecialchars поможет от инъекции тегов HTML, в т.ч. <script>. для наглядности лучше использовать ПРИ ВЫВОДЕ, а не при сохранении. от SQL-инъекций у тебя нет ничего. наверное так тебя и взломали Добавлено спустя 8 минут 2 секунды: смотри фрагмент: Код (PHP): $result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'", $db); допустим у тебя есть пользователь admin, если я введу в поле login такое admin' -- а пароль что угодно, например 123456 строка запроса будет выглядеть так: SELECT * FROM users WHERE login='admin' -- ' AND password='md5otpasswordplusololo' всё, что правее "--" это комментарий MySQL и просто игнорируется так я войду как пользователь admin! проблема лечится просто: перед запросом делай mysql_real_escape_string для всех подставляемых переменных p.s. а вообще пора от расширения mysql отказываться и использовать mysqli или PDO. там, кстати, ты можешь использовать родные плейсхолдеры чтобы всё автоматически экранировалось.
Можно подробнее и есть ли полный пример? И если я ввожу как admin'-- и пароль 123456, то выводит6 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in proverka.php on line 55 Добавлено спустя 6 минут 31 секунду: Ну у меня же база в хостинге, там проверяется логин и пароль или лучше сделать защиту? и как?
ок, я внес поправку: между "--" и тем что далее должен быть хотябы один пробел, иначе MySQL не считает это комментарием. Добавлено спустя 2 минуты 41 секунду: мой тестовый скрипт чтобы убедиться в бесполезности твоих "защит": Код (PHP): <?php $login = "admin' -- o_O"; $password = '123456'; $login = stripslashes($login); $login = htmlspecialchars($login); $password = stripslashes($password); $password = htmlspecialchars($password); $login = trim($login); $password = trim($password); echo "SELECT * FROM users WHERE login='$login' AND password='$password'"; выводит Код (Text): SELECT * FROM users WHERE login='admin' -- o_O' AND password='123456' эта строка прекрасно кушается MySQL и действует как задумано
То есть нужно просто: $result = mysql_real_escape_string("SELECT * FROM users WHERE login='$login' AND password='$password'", $db);
БЛИН!!! НЕ ВЕСЬ ЗАПРОС!!! нужно $login = mysql_real_escape_string($login) и то же с password и любыми переменными, которые ты вклеиваешь в строку запроса.
похоже так и вошли...а можешь более подробно рассказать как лучше всего защитить или дать ссылку на материал... Добавлено спустя 41 секунду: Спасибо большое!!!
ссылку на документацию я давал! там все нужные примеры есть. читай всё!!! там есть важные предостережения.