Добрый день, Нужно написать авторизацию для корпоративной базы данных, с валидацией через SMS. Я не профессионал в PHP, покритикуйте, пожалуйста, моё решение. Код (PHP): <?php include('sms.class.php'); include ('bd.php'); $ip = $_SERVER["REMOTE_ADDR"]; $username = $_POST['login']; $password = $_POST['password']; $passw = md5($password); $db = new database('localhost', 'login', 'password', 'base'); $attemptsip = $db->select("SELECT attempts FROM attempts WHERE ip='$ip'"); //смотрим количество обращений с IP $userdata = array(); $userdata = $db->select("SELECT * FROM users WHERE username='$username'"); if (!$attemptsip) { //если пусто, то присваеваем ноль $attemptsip[0]['attempts'] = '0'; } if ($attemptsip[0]['attempts'] >= 5) { //если попыток пять или больше, то выдаем ответ и прибиваем скрипт if (!$userdata) { //если пользователь не найден exit("Ваш IP заблокирован"); } if ($userdata[0]['active'] == 0) { exit("Ваши IP и логин заблокированы"); } exit("Ваш IP заблокирован"); } if (!$userdata) { //если логин не найден if ($attemptsip[0]['attempts'] == 0) { //если такого IP ещё нету $db->query("INSERT INTO `attempts` (`username`, `ip`, `attempts`) VALUES ('$username', '$ip', '1')"); //то добавляем его с юзернэймом $increment = 1; } else { //если такой IP уже есть $increment = $attemptsip[0]['attempts'] + 1; //получаем количество попыток из базы $db->query("UPDATE attempts SET attempts='$increment' WHERE ip='$ip'"); //и прибавляем одну if ($increment == 5) { //когда количество попыток достигает пяти, выводим сообщение exit("Ваш IP заблокирован"); } $remain = 5 - $increment; //подсчитываем количество оставшихся попыток exit("Неверный пароль. Осталось попыток: $remain"); } $remain = 5 - $increment; //подсчитываем количество оставшихся попыток exit("Неверный пароль. Осталось попыток: $remain"); } function generateCode($length=6) { //генераторка хэшей $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789"; $code = ""; $clen = strlen($chars) - 1; while (strlen($code) < $length) { $code .= $chars[mt_rand(0,$clen)]; } return $code; } if ($userdata[0]['password'] == $passw) { //если пароль подходит if ($userdata[0]['active'] == 0) { //проверяем, не заблокирован ли юзер exit("Ваш логин заблокирован"); //если заблокирован, выводим сообщение и прибиваем скрипт } echo "Success"; $db->query("UPDATE attempts SET attempts='0' WHERE ip='$ip'"); $hash = md5(generateCode(10)); setcookie ("hash", $hash, time() + 3600); //ставим cookies $time = time(); $vercode = rand(100000, 999999); $db->query("INSERT INTO `sessions` (`username`, `cookies`, `time`, `code`) VALUES ('$username', '$hash', '$time', '$vercode')"); //записываем идентификаторы в базу $mobile = $userdata[0]['phone']; $msgopt = array( 'Phone' => $mobile, 'Text' => $vercode, 'From' => 'UCP.BASE' ); $Sms = new SMSClass('login', 'password'); $message = $Sms->SendSMS(array($msgopt)); } else { //если пароль не подходит if ($attemptsip[0]['attempts'] == 0) { //если такого IP ещё нету $db->query("INSERT INTO `attempts` (`username`, `ip`, `attempts`) VALUES ('$username', '$ip', '1')"); //то добавляем его с юзернэймом $increment = 1; } else { //если такой IP уже есть $increment = $attemptsip[0]['attempts'] + 1; //получаем количество попыток из базы $db->query("UPDATE attempts SET attempts='$increment' WHERE ip='$ip'"); //и прибавляем одну if ($increment == 5) { //когда количество попыток достигает пяти, выводим сообщение $db->query("UPDATE users SET active='0' WHERE username='$username'"); //и вырубаем учётку exit("Ваши IP и логин заблокированы"); } $remain = 5 - $increment; //подсчитываем количество оставшихся попыток exit("Неверный пароль. Осталось попыток: $remain"); } $remain = 5 - $increment; //подсчитываем количество оставшихся попыток exit("Неверный пароль. Осталось попыток: $remain"); } ?>
скрипт подвержен SQL инъекциям. т.е. злой школьник даже , сможет делать с БД все что угодно. украсть, удалить, модифицировать, зайти под админом и т.д. читайте в гугле что это и как починить.
да и программист задающий такие вопросы отвечающий за корпоративную базу данных, в компании, которая готова платить за смски, но не готовая взять нормального программиста... пздц
че на парня кинулись? замени свое на это htmlspecialchars вроде фильтрует <,>,',". а trim убирает лишние пробелы пробелы Добавлено спустя 2 минуты 48 секунд: для числовых делай так $num = abs(intval($_POST["$переменная"])):
еще один ..... фильтрует оказывается.... что значит "вроде"? ну возми и прочитай описание функции. сразу узнаешь что она делает на самом деле. а когда прочитаешь подумай, зачем использовать функцию созданную для обработки HTML - в месте подготовки данных для SQL запроса? зачем делать операцию на глазах через жопу - со стороны лица удобнее же, нет?