Проверка пользовательского ввода, на стороне клиента или на стороне сервера? [PHP/JS]

Лучше ли проверять вводимые пользователем данные перед их отправкой на сервер с JS или на стороне сервера с PHP? Или, может быть, стоит сделать и то, и другое, чтобы быть в безопасности?

Я создаю сайт (очень простой на данный момент), который имеет зону для членов / область администратора / и т.д. На данный момент у меня есть только пользовательский ввод имени пользователя и пароля, в будущем их будет больше (электронная почта, адрес и т. Д.), Но какова лучшая практика проверки данных?

Кидаю ли я в него множество операторов if...else, пока пользователь не поймет это правильно? Или, может быть, есть отдельные переменные для каждого значения, введенного пользователем, и установить его в true или false, если это правильно или неправильно? (например, проверка электронной почты, чтобы убедиться, что она в формате электронной почты)

Есть много способов сделать это, но какие из них вы бы предложили? Я не хочу писать 50 строк кода, когда смогу выполнить работу в 10 строк... если это имеет смысл:p

Любая помощь будет оценена, спасибо!:)

6 ответов

Решение

Проверка на стороне сервера является обязательной, проверка на стороне клиента является плюсом.

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

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

Так что, если возможно, используйте оба. Если вы не можете / не хотите, то хотя бы сделайте это на стороне сервера. Проверка только на стороне клиента - рецепт катастрофы!

Делай оба.

Клиентская сторона обеспечивает оперативность, которую ожидают пользователи, а серверная сторона защищает ваши данные.

Я уверен, что в PHP есть несколько библиотек, которые могли бы помочь вам, подобно тому, как ASP.NET MVC предоставляет способ выполнить оба действия за один шаг.

Проверка входных данных должна обязательно происходить на стороне сервера по соображениям безопасности.

Однако, чтобы избежать отправки запроса на сервер с неверными данными и отправки ответа обратно клиенту, также желательно иметь проверку на стороне клиента. Это сделает ваш сайт более отзывчивым. Поэтому добавьте проверку на стороне клиента для удобства пользователей.

Конечно, вы не можете полагаться только на JavaScript, что, если у кого-то он отключен? JavaScript только делает сайт более удобным для пользователя, и ему не нужно ждать сервера каждый раз, когда он совершает ошибку. Серверная часть предназначена для вашего собственного использования, чтобы в вашей системе не было ошибок!

Валидация, ВСЕГДА на стороне сервера. Я могу подделать вашу форму на стороне клиента, заполнить сумасшедшие ценности и все равно пройти проверку. Я не могу вмешиваться в сценарии на стороне сервера.

Поэтому при проверке на стороне клиента вы просто экономите немного времени на "общение" с сервером. Никогда не используйте его для проверки ваших данных на самом деле.

Вы должны проверить это на стороне сервера. Проверка на стороне клиента не является обязательной. Вы можете объявить типы проверки для полей и создать универсальный валидатор для ваших форм. Если вы не знаете, что я имею в виду, попробуйте взглянуть на декларативное построение кода AngularJs. Это лучший способ создания форм, а Angular - это хорошая и очень быстрая среда для создания форм.

http://angularjs.org/

http://docs.angularjs.org/

Посмотрите на эти строки:

<input type="text" name="form.address.line1" size="33" ng:required/> <br/>
    <input type="text" name="form.address.city" size="12" ng:required/>,
    <input type="text" name="form.address.state" size="2" ng:required ng:validate="regexp:state"/>
    <input type="text" name="form.address.zip" size="5" ng:required
  validate="regexp:zip"/>

Для вашей серверной части вы также можете определить некоторую структуру, которая будет содержать поля формы, методы проверки и строку ошибки для каждого поля. Затем в цикле, проверьте каждое поле на основе вашей информационной структуры. Вы можете легко управлять построенными таким образом формами.

Пример в PHP:

Данные формы:

$formData = array (
    array(
     'ID' => "name",
     'validate' => '/.+/',
     'label' => 'Your name',
     'errorMsg' => "This field is required",
     'type' => 'text' 
    ),
 array(
         'ID' => "Phone number",
         'validate' => '/^[0-9+ ]+$/',
         'label' => 'Numer telefonu',
         'errorMsg' => "Please provide proper telephone number",
         'type' => 'text'
        )
);

Валидатор и генератор форм (извините за простой и грязный код здесь):

$s = '';
foreach ($formData as $input){
    $s .= sprintf('<label for="%s">%s</label>',$input['ID'],$input['label']);
    if (isset($_POST[$input['ID']]) && !empty($input['validate']) && !preg_match($input['validate'],$_POST[$input['ID']])){
        $error = true;
         $s .= sprintf('<div class="formErrorValidate">%s</div>',$input['errorMsg']);
    }
    if (isset($_POST[$input['ID']])) $htmlMsg = str_replace('%'.$input['ID'].'%',$_POST[$input['ID']],$htmlMsg);
    if ($input['type'] == 'textarea'){
        $s .= sprintf('<textarea name="%s" id="%s">%s</textarea>',$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:''));
    } else {
        $s .= sprintf('<input type="%s" name="%s" id="%s" value="%s"/>',$input['type'],$input['ID'],$input['ID'],(isset($_POST[$input['ID']])?$_POST[$input['ID']]:''));
    }

}

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