Валидация формы авторизации.
Здравствуйте помогите пожалуйста правильно собрать валидацию формы из двух разных скриптов:
1 скрипт:
$(document).ready(function(){
$("#formlogin").validate({
// правила для полей с именем и паролем
rules:{
email:{
required: true, // поле обязательное для заполнения
},
password:{
required: true, // поле обязательное для заполнения
},
},
// сообщение для поля с именем и пароля, если что-то было не по правилам
messages:{
email:{
required: "<p class='err'>Это поле обязательно для заполнения!</p>",
},
password:{
required: "<p class='err'> Это поле обязательно для заполнения!</p>",
},
}
});
});
2 скрипт:
// Email
$("#email").change(function(){
email = $("#email").val();
$.ajax({
url: "testingLoginEmail.php",
type: "POST",
data: "email=" + email,
cache: false,
success: function(response){
if(response == "no"){
$("#email").next().hide().text("Пользователь с такой электронной почтой не зарегистрирован!").fadeIn(400);
$("#email").removeClass().addClass("inputRed");
}else{
$("#email").removeClass().addClass("inputGreen");
$("#email").next().text("");
}
}
});
});
<?php
include_once "conectbd.php";
if(isset($_POST['email'])){
$email = addslashes($_POST['email']);
$email = htmlspecialchars($_POST['email']);
$email = mysql_real_escape_string(trim($_POST['email']));
$result = $mysqli->query("SELECT `email` FROM `users` WHERE `email` = '$email'");
$myrow = mysqli_fetch_array($result);
if(!$email == $myrow['email'])
{
echo "no";
}
else
{
echo"yes";
}
}
?>
|
$email = addslashes($_POST['email']);
$email = htmlspecialchars($_POST['email']); Зачем? if(!$email == $myrow['email']) - это как понять? И если, пусть бы было здесь все Ок, то наличие пароля не волнует? |
htmlspecialchars- Преобразует специальные символы в HTML-сущности. addslashes- Экранирует строку с помощью слешей. вы считаете что это лишнее? этот ajx запрос маила на наличие его в базу работает я проверял, конечно было бы хорошо и пароль проверить к этому маилу. |
Я знаю, что делают данные функции, я спрашиваю для чего они в данном случае? Поясните.
|
я добавил один код внутри другого работает нормально сообщения об ошибках сплывают, только при сообщении о том что данный логин не существует при нажатии кнопки отправить данные все равно уходят на сервер.
$(document).ready(function(){
$("#formlogin").validate({
// правила для полей с именем и паролем
rules:{
email:{
required: true, // поле обязательное для заполнения
},
password:{
required: true, // поле обязательное для заполнения
},
},
// сообщение для поля с именем и пароля, если что-то было не по правилам
messages:{
email:{
required: "<p class='err'>Это поле обязательно для заполнения!</p>",
},
password:{
required: "<p class='err'> Это поле обязательно для заполнения!</p>",
},
}
});
// Email
$("#email").change(function(){
email = $("#email").val();
$.ajax({
url: "testingLoginEmail.php",
type: "POST",
data: "email=" + email,
cache: false,
success: function(response){
if(response == "no"){
$("#email").next().hide().text("Пользователь с такой электронной почтой не зарегистрирован!").fadeIn(400);
$("#email").removeClass().addClass("inputRed");
}else{
$("#email").removeClass().addClass("inputGreen");
$("#email").next().text("");
}
}
});
});
});
|
как я понимаю эти функции зашита от всяких sql injection.
|
Вы считаете, что в первую очередь для вас важен клиент? Это при том, что на сервере бардак:
$email = addslashes($_POST['email']); - бесполезная операция, куда более полезнее удалять слеши расставленные пользователем. $email = htmlspecialchars($_POST['email']); - это что означает, что в базу данные записываются исключительно после htmlspecialchars? Если да, то это не понимание назначения данной функции, и полная бессмыслица. А если нет, то как можно найти совпадения не преобразованных с преобразованными? То есть это тоже бесполезная и вредная в данном случае операция. $email = mysql_real_escape_string(trim($_POST['email'])); - это да, экранировать параметры запроса необходимо. Но с чего вдруг mysql_real_escape_string когда необходимо mysqli_real_escape_string, и почему так, а не использование средства самого драйвера: подготовленные запросы и метки? $result = $mysqli->query("SELECT `email` FROM `users` WHERE `email` = '$email'"); - это с таким же успехом может проверить и так: "SELECT 1 FROM `users` WHERE `email` = ?" это запрос с учетом подготовленных запросов. Ну а далее можно просто проверить количество возвращенных записей (что не принципиально, конечно). Но !$email == $myrow['email'] не дает ответа на вопрос заполнено ли вообще поле адреса, а ведь оно обязательно для заполнения. По логике, проверка адреса и пароля, тут неизвестно чего вам хочется. Например, можно проверять адрес (есть/нет такой) по кнопке Проверить, при потере фокуса или иначе. Но при приеме формы придется опять его проверять, а также корректность его, также проверять пароль, его наличие и желательно чтобы он были 123 и т.п. У вас же в общем то нет ни проверки, ни диалога. |
mysql_real_escape_string когда необходимо mysqli_real_escape_string.
спасибо не обратил внимания, при регистрации все 3 обработки включены: $email = addslashes($_POST['email']); $email = htmlspecialchars($_POST['email']); $email = mysql_real_escape_string(trim($_POST['email'])); и этот php код только для проверки наличия маила. при потери фокуса как вы и сказали. а далее после нажатии отправить форма идет на другой скрипт:
<?php
session_start();
include_once "../conectbd.php";
if (isset($_POST['submit'])){
$email = addslashes($_POST['email']);
$email = htmlspecialchars($_POST['email']);
$email = mysqli_real_escape_string(trim($_POST['email']));
$password = htmlspecialchars (trim(md5(md5($_POST['password']))));
}
$result = $mysqli->query("SELECT * FROM `users` WHERE `email` = '$email'");
$myrow = mysqli_fetch_array($result);
if ($email == $myrow['email']){
if($password == $myrow['password']){
$_SESSION['status'] = "openstatus";
$_SESSION['surname'] = $myrow['surname'];
$_SESSION['name'] = $myrow['name'];
$_SESSION['patronymic'] = $myrow['patronymic'];
header("Location:../index.php");
exit();
}
else{
header("Location:../index.php");
echo $_SESSION["mesage2"]="<p class='mesage' style='color:red; text-align:center;font-size:11pt;'>Логин или Пароль введен неверно!</p>";
}
}
else{
header("Location:../index.php");
echo $_SESSION["mesage2"]="<p class='mesage' style='color:red; text-align:center;font-size:11pt;>Логин или Пароль введен неверно!</p>";
}
?>
|
Цитата:
$a = ''; var_dump(!$a == null); Есть надобность пояснять еще, что вся ваша проверка пустое? |
так на пустоту стоит required
|
подскажите пожалуйста как запретить отправки формы при выявление что нет такого емаила.
$(document).ready(function(){
$("#formlogin").validate({
// правила для полей с именем и паролем
rules:{
email:{
required: true, // поле обязательное для заполнения
},
password:{
required: true, // поле обязательное для заполнения
},
},
// сообщение для поля с именем и пароля, если что-то было не по правилам
messages:{
email:{
required: "<p class='err'>Это поле обязательно для заполнения!</p>",
},
password:{
required: "<p class='err'> Это поле обязательно для заполнения!</p>",
},
}
});
// Email
$("#email").change(function(){
email = $("#email").val();
$.ajax({
url: "testingLoginEmail.php",
type: "POST",
data: "email=" + email,
cache: false,
success: function(response){
if(response == "no"){
$("#email").next().hide().text("Пользователь с такой электронной почтой не зарегистрирован!").fadeIn(400);
$("#email").removeClass().addClass("inputRed");
}else{
$("#email").removeClass().addClass("inputGreen");
$("#email").next().text("");
}
}
});
});
});
|
Цитата:
Как хотите, можете и обижаться, но когда на сервере код полнейший абсурд, да еще в таком щепетильном вопросе как регистрация/авторизация, при этом прерогативой считают решение вопрос на клиенте, то такое даже комментировать не охота. |
я не понимаю если даже отправите пустую форму все равно не зайдете так как нет совпадении с данными из базы,
вы же не на регистрацию отправляете пустую форму. |
если честно то я новичок самоучка прошу не обижаться если задаю глупые вопросы.
|
и на стороне клиента я хочу проверить только для удобства клиента ,
а так я надеюсь на сервер только. я добавлю в php проверку на пустоту. if(!empty ($_POST['email']) && ($_POST['password'])){ |
Мне то с чего обижаться? :)
Просто нет смысла говорить о проблемах на клиенте, если сервер относится к регистрации/авторизации наплевательски. Какой смысл в вашем JS? Если я поставлю цель взломать вам, то мне ваша проверка на клиенте не требуется. htmlspecialchars используют при выводе в браузер для исключения, к примеру, XSS атак. Выведите на экран строку обработанную mysqli_real_escape_string(), поймете, что addslashes не к месту. Это к сведению. Найдите в сети о регистрации, почитайте каким образом и серьезно к данному вопросу нужно относиться. Когда будет на севере все Ок, вот тогда можно и о JS думать, которое чисто сервис в данном случае. |
ok, спасибо за совет.
но так как тема уже создана не поможете с клиентом? |
Цитата:
Начните с сервера, ибо форму отправить можно и без JS, а обязательность полей в современных браузерах проверять нативно. Лично я без подобающего кода на сервере для данной задачи говорить о клиентском коде не стану. |
| Часовой пояс GMT +3, время: 01:48. |