web-dev-qa-db-ja.com

クライアント側とサーバー側の両方の検証が必要なのはなぜですか?

クライアント側の検証(JavaScript)とバリデーターを使用したサーバー側の検証の両方を使用するための議論は次のとおりです。クライアントブラウザーがJavaScriptをサポートしていない場合、ユーザーはクライアント側の検証を使用できません。

私の質問は、この議論が実際にどれほど良いかということです。理論的には理にかなっていますが、実際には、ブラウザでJavaScriptが無効になっていると、ほとんどのWebサイト機能が機能しなくなります。ユーザーはおそらく、フォームを送信するどころか、JavaScriptなしでページをロードすることさえできないでしょう。

8
Victor

クライアント側の検証は、クライアントが「しかし、これをすべて記入したのに、何も教えてくれなかった」ということを回避するだけです。それは必須ではありません実際には必須であり、実際には、クライアント側の検証は非常に新しいものです(5歳以下を読んでください)。実際には、ページをリロードする前に、クライアント(JSが有効になっている)がフォームに問題がないかどうかを認識できないようにするだけです。 AJAXがゲーム内にある場合、それは異なります-帯域幅を節約し、送信前にユーザーにフィードバックを提供することができます。最後に、厳密にクライアント側を構築している場合は、ピア-ピア交換アプリ(ゲームを考えてください)では、クライアント側の検証でクライアントが不正行為をしないようにする必要があります。

JavaScriptをオフにすることでクライアント側の検証を完全にバイパスできるため、サーバー側の検証も重要です。ある意味で、JS主導の検証は利便性と美的/外観上の改善であり、notに依存する必要があります。さらに、最も複雑なJS検証を無効にしたりバイパスしたりするために、ページのソースをローカルで編集するのは簡単です。

サーバー側で検証しない場合、ユーザーは何ができるでしょうか?あなたが彼らのデータをどのように使うかに応じて、何でも。ユーザーがデータベース全体を削除したり(さらに悪いことに、データベースをリークしたり)、好きなものを変更したり(さらに悪いことに、好きなものを読んだりできます。ディレクトリトラバーサルの欠陥は、いたずらな人にとって非常に一般的な入り口です)、自由に特権を上げることができます。このリスクを冒したいですか?ユーザー入力を検証しないことは、人々を信頼し、家に鍵をかけないようなものです。

35

検証常にサーバー側で実行する必要があります-クライアント側の検証を信頼することはできません。

クライアント側の検証は、常により優れたユーザーエクスペリエンス(UX)を提供するという意味であるため、ユーザーはページを送信して再読み込みする必要はありません。フォームの値が無効であるという理由だけで、物事がより動的になります。

リクエストを行うためにブラウザさえ必要ないので、JSに依存して正しく動作するウェブサイトとは関係なく、データベースをpwnしないことに関心がある場合は、サーバー側の検証とすべてのユーザー入力のサニタイズが必要になります。

これで、動的なクライアント側の検証ヒントをUIに提供するかどうかはあなた次第です。

8

常にサーバー上の入力を保護します。 JavaScriptを無効にしているユーザーだけでなく、サーバーを壊す可能性もあります。

たとえば、サイトの<input>にJavaScriptの最大長チェックがある場合、ユーザーはそのチェックを無効にして、サーバーやデータベースが期待するよりも多くのデータを送信できます。これにより、サーバースレッドを長時間占有する大きなPOSTによってサーバーが過負荷になる可能性があります。たとえば、データベースの制約に違反して永続性情報の詳細が公開される可能性があるなど、データベースの弱点が明らかになる可能性があります。さらに悪いことに、制約がない場合、ユーザーはインジェクション攻撃を実行できる可能性があります。

もう1つの例は、JavaScriptを完全にバイパスして、外部HTTPツールを使用してサーバーにリクエストを送信する人です。 JSON APIをテストするための開発では、常に Advanced REST Client for Chromeを使用しています。

JavaScriptによるクライアント側の検証は、サイトとのやり取りに関する情報をサイトを使用している人にquickerフィードバックを提供する方法にすぎません。従来のクライアント/サーバー通信では、上記の理由により、notが唯一の検証である必要があります。

2
andyb

ユーザーがJavaScriptを無効にした場合、それは彼自身の問題であり、彼は理由のためにJavaScriptを無効にすることを単独で決定しました...そのため、Webサイトを作成するときは、Webサイトがjavascriptなし。両側の検証はいくつかの理由で必要ですが、そのいくつかは次のとおりです。

  • ユーザーがJavaScriptを無効にしました
  • 悪意のあるユーザーがシステムを悪用するためにJavaScriptを削除しました
  • Javascript検証を使用すると、Webサイトとクライアント間のデータトラフィックを削減できます。
  • そしてもちろん、サーバー検証では、データが正しいことを一度確認します

Javascriptと「古い」テクノロジーの両方を使用しているWebサイトを、すべてのユーザーとすべてのブラウザーで有効にすることができます。

1
CodeArtist

クライアント側の検証は、オンザフライのフィールド検証を備えた高度にインタラクティブなフォームのソリューションですが、悪意のあるユーザーが無効な形式のデータをサーバーに挿入して投稿することを防ぐことはできません。サーバーサイドスクリプトがユーザーの実行内容をすべて検証することが重要です。検証しないと、サイトがSQLインジェクション攻撃、XSS攻撃、ユーザーが想定外の処理を実行するなどの問題にさらされることになります。

0
Havenard