Регистрация на сайте
1.
Удаленный (23.01.2016 / 17:22)
Вот набросал скрипт регистрации на сайте.
<?php
session_start();
if(!$_SESSION['login'])
{
require_once('mysql.php');
$login = $_POST['login'];
$password = $_POST['password'];
$mail = $_POST['mail'];
if(empty($login) ) { echo 'Вы не ввели логин'; exit;}
if(!preg_match("/^[a-z]+$/", $login)) { echo 'Логин должен состоять только из латинских букв в нижнем регистре'; exit; }
if(strlen($login) < 3) { echo 'Длина логина должна быть не менее трех символов'; exit; }
if(strlen($login) > 20) { echo 'Длина логина должна быть не более двадцати символов'; exit; }
if(empty($password) ) { echo 'Вы не ввели пароль'; exit;}
if(!preg_match("/^[a-z]+$/", $password)) { echo 'Пароль должен состоять только из латинских букв в нижнем регистре'; exit; }
if(strlen($password) < 5) { echo 'Длина пароля должна быть не менее пяти символов'; exit; }
if(strlen($password) > 20) { echo 'Длина пароля должна быть не более двадцати символов'; exit; }
if(empty($mail) ) { echo 'Вы не ввели мейл'; exit;}
if(!preg_match('/^.+\@.+\.[a-z]+$/', $mail)) { echo 'Мейл должен состоять только из латинских букв в нижнем регистре'; exit; }
if(strlen($mail) < 5) { echo 'Длина мейла должна быть не менее пяти символов'; exit; }
if(strlen($mail) > 50) { echo 'Длина мейла должна быть не более пятидесяти символов'; exit; }
$result = mysqli_query($db, "SELECT login FROM users WHERE login='$login'");
$row = mysqli_fetch_array($result);
if ($row['login'] == $login)
{ echo 'Такой логин есть'; exit; }
$result2 = mysqli_query($db, "SELECT mail FROM users WHERE mail='$mail'");
$row2 = mysqli_fetch_array($result2);
if ($row2['mail'] == $mail)
{ echo 'Такой mail есть'; exit; }
mysqli_query($db, "INSERT INTO users (login,password,mail) VALUES('$login','$password','$mail')");
exit;
}
header("Location: index.php");
?>
Знающие люди скажите есть ли в этом коде какая либо уязвимость или может можно все проще сделать?
2.
karpov-ml (24.01.2016 / 01:31)
Конечно. $_POST фильтруй.
Добавлено через 00:53 сек.
А exit; для чего?
3.
Удаленный (24.01.2016 / 07:13)
ну чтоб дальнейшие скрипты не выполнялись
4.
Алексей (24.01.2016 / 12:36)
$login = $mysqli->real_escape_string($_POST['login']);
Как то так, если не ошибаюсь.
5.
Dmitry Kokorin (24.01.2016 / 16:12)
4.
XwiruS, зачем escape?
$q = $db->prepare("INSERT INTO `users` (`login`, `pass`, `email`) VALUES (?, ?, ?)");
$q->bind_param('sss', $_POST['login'], $_POST['pass'], $_POST['email']);
if($q->execute) echo 'запрос выполнен';
//$db->prepare - mysqli_prepare
//$q->bind_param - mysqli_bind_param
//$q->execute - mysqli_execute
//в bind_param 'i' - integer, 's' - string 'd' - double, float
6.
Алексей (25.01.2016 / 13:50)
5.
DimmoS, Та я хз) Первое что вспомнил написал)
Я ж совсем забил на это дело)
7.
ramzes (25.01.2016 / 14:47)
Нагородили то.
у него регулярка проверяет логин, не надо его дальше фильтровать
8.
Алексей (25.01.2016 / 14:55)
7.
ramzes, ахахаха я в код и не смотрел) Увидел комент карпова и отписал свою мысль)
9.
Dmitry Kokorin (25.01.2016 / 16:25)
7.
ramzes, где ты у меня фильтры видишь?
10.
ramzes (25.01.2016 / 18:30)
9.
DimmoS, для чего ты подготовленное выражение применяешь?
11.
Dmitry Kokorin (25.01.2016 / 21:09)
10.
ramzes, я для всех запросов применяю
URL:
https://visavi.net/topics/42817