Здравствуйте! Делаю валидацию на php. Вот код:
<?php
session_start();
$username = htmlspecialchars(trim($_POST['username']));
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$password = htmlspecialchars(trim($_POST['password']));
$password = md5(md5(trim($_POST['password'])));
if ((preg_match($username, "/[a-z1234567890]{1,30}/")) || (preg_match($name, "/[а-яА-Я] {1,30}/")) || (preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")) || (preg_match($password, "/[a-zA-Z1234567890]{7,30}/"))) {
mysqli_query($connect, "INSERT INTO `users` (`id`, `username`, `name`, `email`, `password`, `date`) VALUES (NULL, '$username', '$name', '$email', '$password', NOW())");
$_SESSION['good-message'] = 'Регистрация прошла успешно!';
header('Location: ../index');
}
else {
$_SESSION['bad-message'] = 'Поля заполнены неверно';
header('Location: ../registration');
}
?>
Где косяк? У меня постоянно выводится сообщение поля заполнены неверно, даже когда всё правильно, по требованию тех символов, которые я указал в качестве допустимых. Буду благодарен, любой помощи!
PHP
Помогите с PHP кодом! Где косяк?
Косяк номер 1:
$username = htmlspecialchars(trim($_POST['username']));
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$password = htmlspecialchars(trim($_POST['password']));
$password = md5(md5(trim($_POST['password'])));
htmlspecialchars НЕ спасает от SQL-инъекции, а md5(md5()) - это известная ламерская глупость. Судя по всему "курсы", по которым ты "учишься" достаточно популярны, т. к. подобный говнокод регулярно встречается на "ответах".
Косяк номер 2a:
if ((preg_match($username, "/[a-z1234567890]{1,30}/")) || (preg_match($name, "/[а-яА-Я] {1,30}/")) || (preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")) || (preg_match($password, "/[a-zA-Z1234567890]{7,30}/"))) {
Условие верно, если хотя бы ОДИН preg_match вернут true. Все || надо заменить на &&. И, кстати, вот это вот [a-z1234567890] заменяется на [a-z\d].
Косяк номер 2b:
preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")
НЕ НАДО проверять e-mail регулярными выражениями - обязательно найдётся корректный адрес, который твоё выражение посчитает ошибочным. Специально для проверки e-mail в PHP есть
filter_var($mail, FILTER_VALIDATE_EMAIL)
Косяк номер 3:
"INSERT INTO `users` (`id`, `username`, `name`, `email`, `password`, `date`) VALUES (NULL, '$username', '$name', '$email', '$password', NOW())".
Должно быть "INSERT INTO `users` (`username`, `name`, `email`, `password`, `date`) VALUES ('$username', '$name', '$email', '$password', NOW())". И, кстати, date тоже не нужно - если дефолтным значением поля date сделать CURRENT_TIMESTAMP.
Косяк номер 4:
Ты НЕ проверяешь, что возвращает mysqli_query и НЕ выводишь mysqli_error в случае ошибки. В результате, не знаешь, на что именно у тебя ругается MySQL.
if (mysqli_query(...) === false) {
echo mysqli_error($connect);
exit;
}
$username = htmlspecialchars(trim($_POST['username']));
$name = htmlspecialchars(trim($_POST['name']));
$email = htmlspecialchars(trim($_POST['email']));
$password = htmlspecialchars(trim($_POST['password']));
$password = md5(md5(trim($_POST['password'])));
htmlspecialchars НЕ спасает от SQL-инъекции, а md5(md5()) - это известная ламерская глупость. Судя по всему "курсы", по которым ты "учишься" достаточно популярны, т. к. подобный говнокод регулярно встречается на "ответах".
Косяк номер 2a:
if ((preg_match($username, "/[a-z1234567890]{1,30}/")) || (preg_match($name, "/[а-яА-Я] {1,30}/")) || (preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")) || (preg_match($password, "/[a-zA-Z1234567890]{7,30}/"))) {
Условие верно, если хотя бы ОДИН preg_match вернут true. Все || надо заменить на &&. И, кстати, вот это вот [a-z1234567890] заменяется на [a-z\d].
Косяк номер 2b:
preg_match($email, "/[a-z1234567890_.]{3,30}\@+[a-z1234567890-]{2,8}\.+[a-z]{2,6}/")
НЕ НАДО проверять e-mail регулярными выражениями - обязательно найдётся корректный адрес, который твоё выражение посчитает ошибочным. Специально для проверки e-mail в PHP есть
filter_var($mail, FILTER_VALIDATE_EMAIL)
Косяк номер 3:
"INSERT INTO `users` (`id`, `username`, `name`, `email`, `password`, `date`) VALUES (NULL, '$username', '$name', '$email', '$password', NOW())".
Должно быть "INSERT INTO `users` (`username`, `name`, `email`, `password`, `date`) VALUES ('$username', '$name', '$email', '$password', NOW())". И, кстати, date тоже не нужно - если дефолтным значением поля date сделать CURRENT_TIMESTAMP.
Косяк номер 4:
Ты НЕ проверяешь, что возвращает mysqli_query и НЕ выводишь mysqli_error в случае ошибки. В результате, не знаешь, на что именно у тебя ругается MySQL.
if (mysqli_query(...) === false) {
echo mysqli_error($connect);
exit;
}
Serega Prokop
Благодарю! Столь развернутый ответ. Возьму во внимание на указанные Вами ошибки. Язык осваиваю сам с нуля. Собственно, как и сам сайт, который я делаю, тоже полностью с нуля, без всякого движка. Как таковых, наставников не имею. На счет курсов, всё верно. Беру то, что в интернете имеется, в курсе, что это не самое лучшее, что может быть против инъекций, а точнее самое худшее, что есть. Ещё раз спасибо, буду осваивать.
Похожие вопросы
- Помогите с php кодом, плиз) хотел функцию транслитерации написать, только ошибка выходит и все :(
- Структура PHP кода
- При написании php кода для отправки записи в базу данных выходит ошибка
- Допиливать самописный движок на PHP, код к которому писали 14 лет - стоит ли соглашаться на такую работу?
- СРОЧНО! ЧТО ВЫПОЛНЯЕТ ЭТОТ PHP КОД?
- Помогите с PHP.
- помогите с php не получается функция
- Как заменить html код с помощью php файла.
- Помогите с кодом PHP
- PHP MYSQL после ввода запроса , отображается пустая строка перед 1 кой, немогу понять Помогите пожалуйста