5

JS を使用してサーバーに送信する前に、または PHP を使用してサーバー側に送信する前に、ユーザー入力を検証する方が良いですか? それとも、安全のために両方を行う価値があるのでしょうか?

メンバーエリア/管理エリア/などを持つサイト (現時点では非常にシンプル) を作成しています。現時点では、ユーザー名とパスワードのユーザー入力しかありませんが、将来的にはさらに多くのユーザー (電子メール、アドレスなど) が入力される予定ですが、データをチェックするベスト プラクティスは何ですか?

ユーザーが正しく理解するまで、大量の「if...else」ステートメントを投げますか? または、ユーザーが入力した値ごとに個別の変数を用意し、それが正しいか間違っているかを true または false に設定しますか? (電子メール形式であることを確認するための電子メール検証など)

方法はたくさんありますが、どの方法がおすすめですか?10行で仕事ができるのに50行のコードを書きたくない...それが理にかなっていれば:p

どんな助けでも大歓迎です、ありがとう!:)

4

6 に答える 6

11

サーバー側の検証は必須であり、クライアント側の検証はプラスです。

クライアント側の検証のみを使用すると、悪意のある人々がシステムをハッキングして検証されていないものを投稿し、スクリプトを破壊し、システムを悪用する可能性があります. これは、セキュリティの観点から非常に悪いことです。

とはいえ、クライアント側の検証も含める必要があります。これは、サーバーへの往復よりもはるかに高速であり、ユーザーに即座にフィードバックを提供できるためです。これにより、ユーザーの満足度が高まり、サイトに戻ってくるようになります。

したがって、可能であれば、両方を使用してください。できない/できない場合は、少なくともサーバー側で実行してください。クライアント側のみの検証は災害のレシピです!

于 2012-01-08T19:18:51.757 に答える
5

両方を行います。

クライアント側はユーザーが期待する応答性を提供し、サーバー側はデータを保護します。

PHP には、ASP.NET MVC が 1 つのステップで両方を行う方法を提供するのと同じように役立つライブラリがいくつかあると確信しています。

于 2012-01-08T19:18:57.840 に答える
4

安全上の理由から、入力の検証はサーバー側で行う必要があります。

ただし、無効なデータでサーバーにリクエストを送信することを避け、クライアントにレスポンスを返すために、クライアント側の検証も行うと便利です。これにより、Web サイトの応答性が向上します。そのため、使いやすさのためにクライアント側の検証を追加してください。

于 2012-01-08T19:19:26.403 に答える
0

検証、常にサーバー側。クライアント側でフォームを改ざんし、クレイジーな値を入力しても、検証を受けることができます. サーバー側のスクリプトを改ざんすることはできません。

したがって、クライアント側をチェックするときは、サーバーと「話す」時間を少し節約できます。データを実際に検証するために使用しないでください。

于 2012-01-08T19:20:42.243 に答える
0

もちろん JavaScript だけに頼ることはできません。JavaScript は、サイトをユーザーにとってより使いやすくするためだけのものであり、ユーザーがミスをするたびにサーバーを待つ必要がありません。システムにミスがないように、サーバー側は自分で使用するためのものです。

于 2012-01-08T19:20:51.350 に答える
0

これをサーバー側で検証する必要があります。クライアント側の検証はオプションです。フィールドの検証の種類を宣言し、フォームの汎用バリデーターを構築できます。意味がわからない場合は、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']]:''));
    }

}

于 2012-01-08T19:21:03.580 に答える