2014-02-05 4 views
0

Я застрял на этом некоторое время. У меня есть форма, которая находится в index.php. Данные отправляются в файл php, называемый processuserform.php. Я извлекаю все входы и присваиваю их каждой своей переменной. Кажется ли, что это правильный способ проверки и дезинфекции формы на стороне сервера?Проверка/программирование на стороне сервера

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

<form method="POST" name="signup" action="php/processuserform.php"> 

    <input id="firstname" onkeyup="validateFirstName()" placeholder="First Name" type="text" /><label id="firstnameprompt"></label> 

    <br><br> 

    <input id="lastname" onkeyup="validateLastName()" placeholder="Last Name" type="text"/> 
    <label id="lastnameprompt"></label> 

    <br><br> 

    <input id="Email" onkeyup="validateEmail()" placeholder="Email" type="text" /> 
    <label id="Emailprompt"></label> 

    <br /><br /> 

    <input id="Password" onkeyup="validatePassword()" placeholder="Create Password" type="password" /><label id="Passwordprompt"></label> 

    <br /><br /> 

    <strong>Male</strong><input id="Gender" type="radio" name="sex" value="male"> 
    <strong>Female</strong><input id="Gender" type="radio" name="sex" value="female"> 

    <br /><br /> 

    Click "Submit" if you agree to <a href="#">"Terms And Conditions"</a> 
    <br> 
    <input id="submit" onclick="return validateUserRegistration()" value="Submit" type="submit" name="submit"/> 
    <label id="submitprompt"></label> 
    <br><br> 

processuserform.php

<?php 

$first_name = ($_POST['firstname']); 
$last_name = ($_POST['lastname']); 
$email = ($_POST['Email']); 
$pw = ($_POST['Password']); 
$gender = ($_POST['Gender']); 

// define variables and set to empty values 
$first_nameErr = $last_nameErr = $emailErr = $pwErr = $genderErr = ""; 
$first_name = $last_name = $email = $pw = $gender = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") 
{ 
    if (empty($_POST["firstname"])) 
    { 
     $first_nameErr = "Name is required"; 
    } 
    else 
    { 
     $first_name = test_input($_POST["firstname"]); 
     // check if name only contains letters and whitespace 
     if (!preg_match("/^[a-zA-Z ]*$/",$first_name)) 
     { 
      $first_nameErr = "Only letters and white space allowed"; 
     } 
    } 

    if ($_SERVER["REQUEST_METHOD"] == "POST") 
    { 
     if (empty($_POST["lastname"])) 
     { 
      $last_nameErr = "Name is required"; 
     } 
     else 
     { 
      $last_name = test_input($_POST["lastname"]); 
      // check if name only contains letters and whitespace 
      if (!preg_match("/^[a-zA-Z ]*$/",$last_name)) 
      { 
       $last_nameErr = "Only letters and white space allowed"; 
      } 
     } 

     if (empty($_POST["Email"])) 
     { 
      $emailErr = "Email is required"; 
     } 
     else 
     { 
      $email = test_input($_POST["email"]); 
      // check if e-mail address syntax is valid 
      if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) 
      { 
       $emailErr = "Invalid email format"; 
      } 
     } 

     if (empty($_POST["Password"])) 
     { 
      $pwErr = "Password is required"; 
     } 
     else 
     { 
      $pw = test_input($_POST["Password"]); 
     } 
    } 
    if (empty($_POST["Gender"])) 
    { 
     $genderErr = "Gender is required"; 
    } 
    else 
    { 
     $gender = test_input($_POST["Gender"]); 
    } 
} 

function test_input($data) 
{ 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 

$hostname="this is correct"; 
$username="this is correct"; 
$password="this is correct"; 
$dbname="this is correct"; 

$db_conx = mysqli_connect($hostname, $username, $password) OR DIE ("Unable to connect to database! Please try again later."); 

if(mysqli_connect_errno()) 
{ 
    echo mysqli_connect_error(); 
    exit(); 
} 

$select = mysqli_select_db($db_conx,$dbname); 

mysqli_query($db_conx,"INSERT INTO users (firstname, lastname, email, password, gender) 
    VALUES ('$first_name', '$last_name', '$email', '$pw', '$gender')"); 
mysqli_close($db_conx); 

header("Location: not/important.php") 
?> 

Спасибо всем за вашу помощь. Если я буду дезинфицировать его и проверить его неправильно, кто-то не даст мне пример того, как он должен выглядеть, используя один из моих входов в качестве примера? Я мог бы использовать помощь, так как это немного запутывает. Еще раз спасибо!

+0

Возможный дубликат [Обработка, проверка и дезинфекция данных] (http://stackoverflow.com/questions/21564265/processing-validating-and-sanitizing-data) – qwertynl

ответ

0

Вы не указали свой код проверки JavaScript.

Проблема заключается в том, что вы выполните те же проверки сначала в JavaScript, а затем в PHP. Если по какой-либо причине функции проверки не совпадают, результат может быть непоследовательным.

Мой совет:

1), если вы не планируете поддерживать браузеры с JavaScript отключены, просто уронить PHP проверки

2) если вы хотите поддерживать не письменность браузеров, вы должны обнаружить что JS отключен и предупреждает пользователя о том, что форма может быть отклонена после проверки (может быть очень сложно заполнить длинную форму только для получения ошибки после ее отправки)

Если вы поддерживаете обе проверки одновременно, вы должен приложить все усилия, чтобы иметь условный код проверки, используя те же регулярные выражения и doi проверок в том же порядке.

Непросто распространять код между JS и PHP, но вы можете создать общий формат для проверки полей и иметь механизм проверки JS и PHP, используя те же определения полей.
Это был бы самый последовательный подход, но это большая работа, поэтому, если у вас есть только одна форма для проверки, это может не стоить усилий.

EDIT: ответить на ваши дополнительные замечания и вопросы

Для простоты использования, гораздо лучше иметь JavaScript данные проверки формы на лету. Он позволяет пользователю знать, что вся необходимая информация была введена перед отправкой формы.
Проверка PHP приведет к созданию страницы с ошибкой и заставит пользователя вернуться на страницу формы и (в зависимости от браузера), возможно, повторно введите весь набор информации, если вы не добавили некоторый код PHP, чтобы заполнить поля предыдущими значениями.

Вы должны прибегать к проверке PHP только в том случае, если JavaScript отключен или вы хотите предотвратить вредоносное представление (т. Е. Какой-то хакер, имитирующий почтовый запрос без использования вашей формы).

О поддержке браузеров без сценариев, я бы сказал, что 90% современных сайтов не будут работать должным образом (или предлагают плохой опыт работы с пользователями) с отключенным JavaScript и/или куки, так что это не было бы такой большой сделкой IMHO ,
Все зависит от того, на какую аудиторию вы нацеливаетесь.

+0

Благодарим вас за информацию. Я хочу поддержать тех, у кого включен Javascript, и тех, кто этого не делает. Я не знал, что Javascript и PHP должны быть одинаковыми. Я буду перенастроить свой PHP в соответствии со своим Javascript. Могу ли я санировать и проверять данные выше, делая это, как я это сделал или нет? Я очень ценю ваш ответ. – user3066599

+0

У меня две формы в index.php. Один для пользователей и один для бизнеса. Я просто пытаюсь получить пользователей, и я буду работать над этим бизнесом. – user3066599

+0

Было бы разумно не разрешать браузерам, у которых отключен javascript? – user3066599

2

Вы определенно хотите получить подтверждение на стороне сервера (выполнение проверки в javascript вообще не защищает ваши данные!) В любом случае вы должны позволить пользователю вводить данные формы, POST, которые проверяют его, и если есть ошибки, ваш php переписать форму с существующими заполненными данными (так что пользователю не нужно вводить ее снова) и сообщениям против записей с ошибкой.

есть что-то вроде: (! Очень упрощенный)

echo '<input id="firstname" value="' . $first_name . '"/>'; 
if($first_nameErr != "") 
    echo 'Error: '.$first_nameErr; 

Ваши, TonyWilk

+0

Большое спасибо. Это то, что мне нужно. – user3066599

1

проверки Javascript хорошо, но только для UI цели, так как пользователь может обойти эту проверку, как Javascript основан клиент ,

Для того, чтобы отключить Javascript, я буду следовать за Kuroi Neko, как он объяснил хорошо.

Что касается проверки на стороне php и проверки javascript, вы можете сохранить оба варианта, это не будет проблемой. Но на сегодняшний день хорошие практики, я думаю, вы должны работать с формами, основанными на ajax, что является хорошим вариантом, и вам не придется переписывать свои формы, если произошла ошибка (я считаю, что javascript всегда включен).

Вам необходимо будет выполнить всю вашу проверку на стороне сервера в php-коде, который не может быть обойден пользователем. После формы, представленной ajax, вы проверяете все поля формы там. Если есть ошибка, то возвратите сообщения об ошибках в запрос ajax и покажите их. Если ошибок нет, сделайте то, что вы хотите делать с данными формы, а затем верните сообщение об успешном завершении в ajax-запрос.

Основываясь на возвращенных сообщениях на запрос ajax, вы можете делать все, что захотите, отображать сообщения об ошибках/успешных сообщениях, перенаправлять пользователей на другую страницу после успеха или просто скрывать форму и отображать сообщение об успешном завершении.

Для подачи формы ajax, я предлагаю вам использовать JQuery Form plugin. Он очень прост в использовании и поддерживает разные типы данных, такие как json, xml и html. На странице примера перечислите рабочие коды, чтобы вы могли легко их принять.

+0

Благодарим вас за информацию. Я рассмотрю формы, основанные на ajax. Из того, что я слышу, похоже, что это намного лучший опыт для пользователя и дизайнера. – user3066599

Смежные вопросы