Проверка пользовательского ввода на стороне клиента или на стороне сервера? [PHP / JS] - PullRequest
5 голосов
/ 08 января 2012

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

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 08 января 2012

Проверка на стороне сервера - это необходимость , проверка на стороне клиента - плюс .

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

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

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

5 голосов
/ 08 января 2012

Делайте и то, и другое.

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

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

4 голосов
/ 08 января 2012

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

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

0 голосов
/ 08 января 2012

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

http://angularjs.org/

http://docs.angularjs.org/#!/cookbook/advancedform

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

<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']]:''));
    }

} ​​

0 голосов
/ 08 января 2012

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

0 голосов
/ 08 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...