Пишу валидацию есть вопросы! Хочется написать красиво, но не получается выводить ошибки. Давайте так я скину пример и ниже опишу в чём суть. Вот кусок кода: PHP: class UserController { /** * Action для страницы "Регистрация" */ public function actionRegister() { // Переменные для формы $login = false; $email = false; $password = false; $result = false; // Обработка формы if (isset($_POST['submit'])) { // Если форма отправлена // Получаем данные из формы $login = $_POST['login']; $email = $_POST['email']; $password = $_POST['password']; // Флаг ошибок $errors = false; // Валидация полей if (!User::checkName($login)) { $errors[] = 'Имя не должно быть короче 2-х символов'; } if (!User::checkEmail($email)) { $errors[] = 'Неправильный email'; } if (!User::checkPassword($password)) { $errors[] = 'Пароль не должен быть короче 6-ти символов'; } if (User::checkEmailExists($email)) { $errors[] = 'Такой email уже используется'; } if ($errors == false) { //генерируем соль $salt = User::generateCode(5); //получает хеш-сумму пароля и соли $password = md5($password.$salt); // Если ошибок нет // Регистрируем пользователя User::register($login, $email, $password, $salt); header("Location: /"); } } // Подключаем вид require_once(VIEW . '/user/register.php'); return true; } } После нажатия кнопки формы данные проходят валидацию. Если какое либо поле не проходит проверку то в массив $errors = false; попадает значение ну допустим это $errors[] = 'Имя не должно быть короче 2-х символов'; Данная функция которая проверяет длину строки находится в моделе User и имеет вид: PHP: /** * Проверяет имя: не меньше, чем 2 символа */ public static function checkName($login) { if ($login >= 2) { return true; } return false; } Я хочу проверять не только длину строки но и скажем чтобы были только латинские буквы и кроме этого отсечь все цифры подчёркивания и прочее. Я хочу чтобы моя функция была не в одну строку, должна выводить предупреждения чтобы логин состоял из латинских символов и был не короче 2-х символов. По сути функция должна иметь такой вид: PHP: public static function checkName($login) { if(!preg_match("/^[a-zA-Z]{1,20}$/"), $login){ $errors[] = 'Логин должен быть из латинских символов и не более 20 символов'; }elseif(!$login >= 2){ $errors[] = 'Логин не должен быть короче 2-х символов'; }else{ return true; } } Когда я писал красиво имелось введу вот это(то что находится в экшене): PHP: f (!User::checkName($login)) { $errors[] = 'Имя не должно быть короче 2-х символов'; } Тут с выводом ошибок проблем нет. Хочется чтобы валидация логина была одной функцией, но у меня не получается из модели передать ошибки в массив $errors[] который находится в контроллере =) UserController Вот что делать кинуть этот код в контроллер? Ну будет же некрасиво... Да и данные должны же обрабатываться в моделе. Подскажите как быть? Я не знаю. Буду рад любому дельному совету.
1. Логин емейл пароль. Пароль ладно, а логин и емейл зачем разделять? Почта должна быть и так уникальна - вот тебе и логин. А дальше уже можно юзеру дать возможность дополнительно выбрать себе уникальный юзернейм. 2. Пароль хочу сам себе назначать. Не твоё это дело какие мне пароли нравятся. Хочу единичку ткнуть и ок нажать. Дай мне! 3. Не храни мою единичку в открытом виде! Используй функции хэширования паролей и храни хэш пароля а не его значение. Ну пожалуйста! 4. Соль при этом можешь не хранить, так как нормальная функция хэширования пароля и так умеет соль. Ты ей строки, а она тебе подсоленные хэши. Удобно же!
Html5 тоже может валидировать поля, в атрибутах можно длину тип хоть регуляркой проверять чтобы не гонять лишний раз сервер.
4 ответа и ни одного дельного совета. Я же не прошу сделать за меня! Я не знаю за что взяться! Этот проект - велосипед. Сам я продвинуться не могу. Так что давайте без флуда. Я старался для вас всё расписать имейте совесть!
@Titos мой список из четырёх пунктов видел? Тебе из них как минимум научиться не хранить пароль в открытом виде.
А давайте без "давайте", у вас тема как называется? Если у вас проблема: То наверное вам нужно почитать про функцию include
PHP: // Обработка формы if (isset($_POST['submit'])) { // Если форма отправлена // Получаем данные из формы $login = $_POST['login']; $email = $_POST['email']; $password = $_POST['password']; vs PHP: if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { $args = [ 'name' => [ 'filter' => FILTER_VALIDATE_REGEXP, 'options' => [ 'regexp' => '/^[A-Za-z0-9_-]{3,25}$/' ] ], 'email' => FILTER_VALIDATE_EMAIL, 'password' => FILTER_DEFAULT ]; $error = []; $inputs = filter_input_array ( INPUT_POST, $args ); PHP: // Флаг ошибок $errors = false; Объявляем переменную с булевым значением, а используем ее как контейнер с массивами данных. Ошибка с типами. не нужна password_hash ( $pass, PASSWORD_DEFAULT ); password_verify --- Добавлено --- Porno5 тоже может иметь всех, в трусах можно длину измерить и регулярно гонять лишний раз своего лысого.
PHP: function f(array &$errors) { $errors[] = "Пользователь идиот"; } $errors = []; for ($i = 0; $i < 10; $i++) { f($errors); } var_export($errors);
Ключевой момент "чтобы не гонять лишний раз на сервер". Валидация на стороне клиента - ни в коем случае не мера защиты. Это не более, чем мера добавления удобства для пользователя и снижения количества "ложных" запросов. Снижения, а не сведения к 0. Все эти валидации, при желании, обходятся без малейшего напряга прям в браузере.
Видел. Я честно говоря части не понял. Не удалось Вам донести суть =). В общем с завтрашнего дня буду штудировать.
Насчёт длины пароля не согласен. Но все проверки данных, которые можно делать на стороне клиента, нужно там делать. В Вашем примере это длина логина и пароля. А остальные проверки уже на сервере. А хэшировать конечно нужно
Проверки на стороне клиента могут быть любые, но они носят исключительно декоративный характер. p.s. а пароля вообще быть не должно. Сделайте авторизацию через соц.сети-гуглы, ну или спросите мыло что бы прислать на него одноразовую ссылку на вход. Ну и логин, да, ничего не бесит больше чем логин. Есть почта, что вам ещё надо то? ) Извиняюсь, накипело )
И тогда, если ты не залогинен в почте/гугле/соцсетях, тебе придется вбивать логин и пароль там. Мне больше нравятся логины. Почт у меня много, а логинов нет. И логин короче почты. Изначально на проекте был вход только по логину. У части народа бомбило от того, что нет входа по почте. Переделка на вход по почте вызвала бы бомбеж у тех, кому удобнее с логином. В итоге сейчас можно входить и так и так, указываешь в поле либо логин, либо почту, а сервак сам разберется. Имхо - лучшее решение. --- Добавлено --- Да что ты вообще понимаешь в жизни и криптоустойчивости, мальчик? Не понимаешь ничего в кибербезопасности - не лезь, а делай то, что говорят профи: --- Добавлено --- Тот случай, когда ты вбиваешь люто сложный пароль на учетку, под которой крутится некоторое бабло, а эта дрянь просит тебя его УПРОСТИТЬ и не дает зарегаться. Вот правда, в сбере, в отделе разработок реально работают люди, которые думают, что хэш-функции не все равно?
Вот как раз понимают что не надо шутить с баблом и совать туда как попало кодируемые многобайтные иероглифы.
Еще один знаток принципов работы хэш-функций подъехал? Расскажешь мне, как многобайтные иероглифы могут помешать при правильном хранении пароля? Дам тысячу рублей, если раскроешь мне уязвимости, которые так можно эксплуатировать при том же password_hash(). Если таковых не раскроется, ты мне должен будешь тысячу. По рукам?