Проверка на стороне сервера / Программирование и дизайн

Я застрял на этом в течение некоторого времени. У меня есть форма, которая находится в 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")
?>

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

3 ответа

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

то есть что-то вроде: (сильно упрощено!)

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

Твой ТониВилк

Проверка Javascript хороша, но только для целей пользовательского интерфейса, потому что пользователь может обойти эту проверку, так как javascript основан на клиенте.

Для отключенного JavaScript, я буду следовать за Куроем Неко, как он хорошо объяснил.

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

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

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

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

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

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

Мой совет:

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

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

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

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

РЕДАКТИРОВАТЬ: ответить на ваши дополнительные замечания и вопросы

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

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

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

Другие вопросы по тегам