С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
347 / 322 / 203
Регистрация: 27.06.2014
Сообщений: 762
1

Безопасная регистрация

04.03.2016, 10:26. Показов 1023. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

Вот я собственно попытался сделать систему регистрации, в PHP пока еще не особо силен, только понемногу начинаю учится.

Хотелось бы попросить знающих программистов оценить код на безопасность (взломают ли меня за 5 минут или нет), поглядеть что да как, дать какую нибудь оценку моему труду (все таки получить от специалиста толковую оценку своей работы это важно).

Дать какие нибудь подсказки, что правильно что не правильно у меня и тд...

В коде старался работать с классами так как это сейчас модно, стильно, молодежно и тд
Вложения
Тип файла: rar test-site.rar (420.5 Кб, 8 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2016, 10:26
Ответы с готовыми решениями:

Безопасная авторизация
Здравствуйте авторизация после проверок проходит так: session_name('sid'); ...

Безопасная загрузка изображений
Тема достаточно часто обсуждаемая в интернете, но готового скрипта не нашел. Сразу скажу, что...

безопасная передача переменных
Добрый день. Задался таким вопросом - как передать переменную через форму, что бы другой человек не...

Безопасная загрузка фото
Подскажите пожалуйста, безопасен и актуален ли данный код (загрузка фото): if(isset($_FILES)){...

15
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
04.03.2016, 12:42 2
Бегло посмотрел код. Фильтрацию (проверку) входных данных не обнаружил.
Код взял из разных файлов. Думаю, вы сами найдёте что и где.

Например...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require_once "../my-function/my-function.php";
require_once "../my-class/my-class.php";
 
//Получили данные от пользователя. Где проверка/фильтрация? Наверно далее....
$email = $_GET["email"];
$password = $_GET["password"];
 
 
//Если есть мыло и пароль то Authorization? Ок.... там проверка?
if(isset($email) && isset($password)) {
try{
Authorization::searchUser(array("email" => $email, "password" => $password));
.....
 
//Ваш класс из другого файла
class Authorization {
    static function searchUser($data) {
//Прекрасно. Подготовили sql запрос с непонятно каким email. Проверки нет. Далее вы выполните его. (
        $query_email = 'SELECT * FROM `users` WHERE email = :email';
Вывод - прекрасная возможность для SQL инъекции. Вы не проверяете данные, не используете функции для проверки либо регулярные выражения.
1
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
04.03.2016, 12:57 3
arcmag, а я бы на вашем месте больше беспокоился о архитектуре движка. Хоть и чистенько, но все вперемешку.
Имена типа my-class и my-function совершенно не дают инфы о своем содержимом.
С кодировками тоже косяк.
Честно говоря к каждой строчке можно придраться...
Цитата Сообщение от arcmag Посмотреть сообщение
В коде старался работать с классами так как это сейчас модно, стильно, молодежно и тд
Еще более модно будет использовать mvc.
А вообще тему ООП вам тоже стоит перечитать, классы это не просто набор статичных функций.
1
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
04.03.2016, 12:58 4
тоже бегло посмотрел код.
Цитата Сообщение от useruser Посмотреть сообщение
Вывод - прекрасная возможность для SQL инъекции.
не заметил этого. защита в виде подготовленного выражения пдо хорошая.
могу ошибаться…
Цитата Сообщение от useruser Посмотреть сообщение
Фильтрацию (проверку) входных данных не обнаружил.
вот
PHP
1
2
3
        if(!is_array($data)) {
            throw new Exception("Не корректный тип входных данных!");
        }
вот
PHP
1
2
3
        if(!preg_match(DefaultInfo::$p_login, $data['login'])){
            throw new Exception("Логин может состоять только из букв английского алфавита и цифр");
        }
и вот
PHP
1
2
3
        if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Не корректный email");
        }
Добавлено через 54 секунды
Цитата Сообщение от tarasalk Посмотреть сообщение
Честно говоря к каждой строчке можно придраться...
например
1
347 / 322 / 203
Регистрация: 27.06.2014
Сообщений: 762
04.03.2016, 13:18  [ТС] 5
Цитата Сообщение от useruser Посмотреть сообщение
Вы не проверяете данные, не используете функции для проверки либо регулярные выражения.
Ну я читал что вроде бы если подготавливать запрос к БД в таком стиле

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
        $q_add_user = "INSERT INTO `users` (login, email, password) VALUES (:login, :email, :password)";
 
        $db = new DB(DefaultInfo::$defaultDataDB);
        $pdo = $db->connect();
 
        $data = array(
            'email'     =>  $user->email,
            'login'     =>  $user->login,
            'password'  =>  $user->password
        );
 
        $user_data = $pdo->prepare($q_add_user); // 1
        $user_data->execute($data); // 2
то это вроде бы безопасно...
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
04.03.2016, 13:21 6
Цитата Сообщение от WhiteMind Посмотреть сообщение
не заметил этого. защита в виде подготовленного выражения пдо хорошая.
Вы понимаете смысл процитированных вами участков кода? На каких этапах производится проверка и что она делает?

Ну и по определению, принятые данные должны быть сразу проверены (отфильтрованы). На стороне сервера. Сразу.
Функциями, регулярными выражениями...чем угодно...главное отфильтрованы. Так надо организовать логику системы.
А не откладывать эту задачу. Вот сначала если есть логин и email тогда создам из них массив, а потом....и там где то...
А там где то уже взломают.
1
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
04.03.2016, 13:23 7
Цитата Сообщение от useruser Посмотреть сообщение
А там где то уже взломают.
как взломают?
Цитата Сообщение от useruser Посмотреть сообщение
Вы понимаете смысл процитированных вами участков кода?
а вы? возможно вы видите как в обход проверок данные подаются на создание юзера? я не заметил этого.
Цитата Сообщение от useruser Посмотреть сообщение
На стороне сервера.
а это что?
1
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
04.03.2016, 13:24 8
Цитата Сообщение от WhiteMind Посмотреть сообщение
Цитата Сообщение от tarasalk Посмотреть сообщение
Честно говоря к каждой строчке можно придраться...
например
Например класс регистрация. Прям в коде прокомментирую.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?
// почему все статичное?
class Registration {
    // зачем выносить sql сюда, почему бы не создать полноценные методы
    static private $query_table = 'SELECT * FROM `users`';
    static private $query_login = 'SELECT * FROM `users` WHERE login = :login';
    static private $query_email = 'SELECT * FROM `users` WHERE email = :email';
 
    // функциональность не совпадает с именем метода
    static function init($data) {
        // жесткая зависимость сразу от двух классов
        $db = new DB(DefaultInfo::$defaultDataDB);
        $pdo = $db->connect();
 
        // с какого перепуга Exception на банальную проверку данных.
        if(!is_array($data)) {
            throw new Exception("Не корректный тип входных данных!");
        }
 
        // почему регулярка берется из совершенно левого класса?
        if(!preg_match(DefaultInfo::$p_login, $data['login'])){
            throw new Exception("Логин может состоять только из букв английского алфавита и цифр");
        }
 
        // каша с названиями
        $login_test = $pdo->prepare(self::$query_login);
        $login_test->execute(array('login' => $data["login"]));
 
        // зачем цикл? для проверки достаточно найти хотя бы одного пользователя с таким логином
        foreach($login_test as $login_db){
            // то что это массив, не гарантирует что пользователь уже существует
            if(is_array($login_db)) {
                // грамматическая ошибка
                throw new Exception("Пользователь с таким логином уже суещствует!");
            }
        }
 
 
        if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Не корректный email");
        }
 
        $email_test = $pdo->prepare(self::$query_email);
        $email_test->execute(array('email' => $data["email"]));
        foreach($email_test as $email_db){
            if(is_array($email_db)) {
                // перемешан html и php.
                throw new Exception("Указанный e-mail(" . $data["email"] . ") уже занят!<br>");
            }
        }
 
        // еще две жесткие зависимости. 
        // переход в контроллер должен быть только из роутера
        DBController::addUser(new CreateUser($data));
 
        header("Location: http://" . $_SERVER["SERVER_NAME"] . "/registration/info.php?email=" . $data["email"]);
    }
}
1
347 / 322 / 203
Регистрация: 27.06.2014
Сообщений: 762
04.03.2016, 13:26  [ТС] 9
tarasalk,
Цитата Сообщение от tarasalk Посмотреть сообщение
С кодировками тоже косяк.
Вот тут соглашусь... прямо не знаю что делать.

Раньше я на php почти не кодил а тут решил и возникла такая беда с этими кодировками, файл через файл выдавалась сплошная абракадабра!

Хотя сейчас вроде бы все работает как надо...

Цитата Сообщение от tarasalk Посмотреть сообщение
а я бы на вашем месте больше беспокоился о архитектуре движка.
- а это где можно почитать про такое (ну только чтоб более менее понятно было начинающему)?
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
04.03.2016, 13:38 10
Цитата Сообщение от WhiteMind Посмотреть сообщение
а вы? возможно вы видите как в обход проверок данные подаются на создание юзера? я не заметил этого.
А кто говорил о создании? Не я. Вы смотрите не там. Смотрите авторизацию.
Цитата Сообщение от WhiteMind Посмотреть сообщение
как взломают?
Вот. Посмотрите там где надо.

Цитата Сообщение от WhiteMind Посмотреть сообщение
а это что?
Фильтрация входных данных пользователя может осуществляться на стороне клиента или сервера.
Для "веб" решений.
Клиент - это браузер. Язык javascript.
Сервер - это веб-сервер. Язык - php.

Цитата Сообщение от arcmag Посмотреть сообщение
Ну я читал что вроде бы если подготавливать запрос к БД в таком стиле
Стиль подготовки запроса не подразумевает защиту вашей системы от взлома.
Не вижу никакой безопасности в приведенном выше коде.

Добавлено через 4 минуты
Цитата Сообщение от arcmag Посмотреть сообщение
Раньше я на php почти не кодил а тут решил и возникла такая беда с этими кодировками
Кодировки это - одна кодировка (пусть utf-8) для всего нижеперечисленного
1) Базы (при создании)
2) Подключения к базе
3) Файлов-скриптов как текстовых файлов (utf-8 ,без bom)
4) Метатег в выходном html файле.
5) Указание кодировки в .htaccess
Вроде всё...
1
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
04.03.2016, 13:51 11
Цитата Сообщение от useruser Посмотреть сообщение
Смотрите авторизацию.
хм. вроде бы все правильно же.
минус канешно
что нет проверки на размер и могут гоняться большие email на sql сервер.
может быть переполнение запроса...
опасности для взлома я тут не вижу. просто не эфективно
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    static function searchUser($data) {
        $query_email = 'SELECT * FROM `users` WHERE email = :email';
 
        $db = new DB(DefaultInfo::$defaultDataDB);
        $pdo = $db->connect();
 
        if(!is_array($data)) {
            throw new Exception("Не корректный тип входных данных!");
        }
 
        $user = $pdo->prepare($query_email);
        $user->execute(array('email' => $data["email"]));
 
        if($user->rowCount() == 0) {
            throw new Exception("Указанный вами e-mail(" . $data["email"] . ") не найден!");
        }
 
        foreach($user as $info){
            if($data["password"] == $info["password"]) {
                self::authorUser($info["id"]);
                header("Location: http://" . $_SERVER["SERVER_NAME"]);
            }
            else {
                throw new Exception("Вы ввели не верный пароль");
            }
        }
    }
Цитата Сообщение от tarasalk Посмотреть сообщение
// жесткая зависимость сразу от двух классов
а как тут надо поступить?
Цитата Сообщение от tarasalk Посмотреть сообщение
// с какого перепуга Exception на банальную проверку данных.
это не очень правильно.
Цитата Сообщение от tarasalk Посмотреть сообщение
// зачем выносить sql сюда, почему бы не создать полноценные методы
так проще и быстрее. задача же только в регистрации.
думаю что все замечания справедливы( особенно про Exception ), однако безопсность( возможность sql инекции, занесение неправельных данных в базу, получение доступа без пароля - я не заметил, хотя пароль можно было бы и захешировать ) вроде бы не нарушена.
1
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
04.03.2016, 14:05 12
Цитата Сообщение от WhiteMind Посмотреть сообщение
хм. вроде бы все правильно же.
Ладно, уточню. С комментариями

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
require_once "../my-function/my-function.php"; //Подключили файл
require_once "../my-class/my-class.php"; //Подключили файл
 
$email = $_GET["email"]; //Приняли неизвестно что методом GET
$password = $_GET["password"]; //Приняли неизвестно что методом GET
 
//Если есть 2 неизвестно что
if(isset($email) && isset($password)) {
    try{
//Это неизвестно что формируем в массив. И этот массив с неизвестно чем передаем в ф-цию searchUser класса Authorization
Authorization::searchUser(array("email" => $email, "password" => $password));
//Далее ещё код
?>
Уже тут должны были возникнуть вопросы...



PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Класс и функция
class Authorization {
    static function searchUser($data) {
 
//Подготовили переменную с ниизвестно чем
        $query_email = 'SELECT * FROM `users` WHERE email = :email';
//Работаем с БД
        $db = new DB(DefaultInfo::$defaultDataDB);
        $pdo = $db->connect();
 
//Неизвестно что массив? Если нет - давай досвиданья (и тоже не совсем корректно, но не суть)
        if(!is_array($data)) {
            throw new Exception("Не корректный тип входных данных!");
        }
//Надежда на pdo? 
 $user = $pdo->prepare($query_email);
//Прекрасно, только что мы выполнили sql запрос с неисвестно чем!
        $user->execute(array('email' => $data["email"]));
0
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
04.03.2016, 14:10 13
Цитата Сообщение от useruser Посмотреть сообщение
//Прекрасно, только что мы выполнили sql запрос с неисвестно чем!
хоть бинарные данные и \x00 - какая разница?
prepare - должен экранировать все.
раз все экранированно то

запись вида email = :email
понимается на Sql сервере как IsEqual( `email` , '..data..' ) и не как иначе.
=> может быть только переполнение запроса и возможные изза этого исключения.
поправте меня если я где то ошибся
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
04.03.2016, 14:26 14
Цитата Сообщение от WhiteMind Посмотреть сообщение
поправьте меня если я где то ошибся
Всё вами вышенаписанное верно. И вроде нет угрозы, но...
Я бы всё равно советовал фильтровать данные после их получения и не надеяться на prepare.
Автор этого не делает и пропускает неотфильтрованные данные до самого запроса. Это плохая привычка.

Обратите внимание (цитаты),
"Вызов PDO::prepare() .... а также помогает избежать SQL инъекций, так как нет необходимости экранировать передаваемые параметры." Здорово.
Но:
"Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск."

Если вас устраивает такой подход к безопасности, то да - угрозы нет.
Но я останусь при совоем мнении - так делать нельзя. И если автора захотят взломать, то это сыграет взломщикам на руку.
Но скорее всего, автор как Неуловимый Джо...
0
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
04.03.2016, 14:51 15
Цитата Сообщение от WhiteMind Посмотреть сообщение
Цитата Сообщение от tarasalk Посмотреть сообщение
// жесткая зависимость сразу от двух классов
а как тут надо поступить?
Например внедрить внешние зависимости через конструктор. Тык

Кстати еще заметил проблему в тех же строчках:
PHP
1
2
$db = new DB(DefaultInfo::$defaultDataDB);
        $pdo = $db->connect();
Смысл в классе DB, если из него все равно сразу же вытаскивают pdo и работают только с pdo. Раз уж сделали обертку над pdo, так работайте с высокоуровневой оберткой, которую легко модернизировать( например вообще сменить pdo на другое)
0
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
04.03.2016, 14:57 16
Цитата Сообщение от tarasalk Посмотреть сообщение
Например внедрить внешние зависимости через конструктор. Тык
ну с дб да, можно было бы и передавать, впрочем из-за примитивности задачи и ускорения разработки можно и так как сделал arcmag, ну а DefaultInfo - будем считать конфиг простанство для переменных.
0
04.03.2016, 14:57
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2016, 14:57
Помогаю со студенческими работами здесь

Безопасная форма авторизации
Вопрос такой. Является ли приведенная ниже форма, полностью безопасной. Если он не является...

Безопасная загрузка аватаров на сервер
Здравствуйте. Нашел код загрузки аватаров и переделал под себя не много, но есть вопрос по...

Безопасная загрузка с нужным форматом
На _http://php.net/manual/ru/features.file-upload.php есть скрипт загрузки изображений,выложенный...

Безопасная передача данных в БД MySQL ?
тему я начал ещё на странице http://www.relib.com/forums/forum.aspx?id=9 но мне посоветовали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru