他の人が言ったように、両方を実行する必要があります。理由は次のとおりです。
クライアント側
平均的なユーザーにより良いフィードバックを与えることができるため、最初にクライアント側で入力を検証する必要があります。たとえば、無効なメールアドレスを入力して次のフィールドに移動した場合、エラーメッセージをすぐに表示できます。これにより、ユーザーはフォームを送信する前にすべてのフィールドを修正できます。
サーバー上でのみ検証する場合は、フォームを送信し、エラーメッセージを受け取って、問題を突き止める必要があります。
(この問題は、ユーザーの元の入力が入力された状態でサーバーがフォームを再レンダリングすることで緩和できますが、クライアント側の検証はさらに高速です。)
サーバ側
悪意のあるユーザーから保護できるため、サーバー側で検証したいJavaScriptを簡単にバイパスして危険な入力をサーバーに送信できるからあります。
UIを信頼するのは非常に危険です。彼らはあなたのUIを乱用するだけでなく、あなたのUIをまったく使用していないかもしれません。ユーザーが手動でURLを編集したり、独自のJavascriptを実行したり、別のツールでHTTPリクエストを微調整したりしたらどうなるでしょうか。curl
たとえば、スクリプトからまたはスクリプトからカスタムHTTPリクエストを送信するとどうなりますか?
(これは理論的なものではありません。たとえば、ユーザーの検索を多くのパートナー航空会社、バス会社などに送信して、POST
、ユーザーが各会社の検索フォームに入力し、収集してソートしたかのようにリクエストをしましたすべての結果。これらの企業のフォームJSは実行されなかったため、返されたHTMLにエラーメッセージを表示することが重要でした。もちろん、APIは良かったでしょうが、これは私たちがしなければならなかったことです。)
これを許可しないことは、セキュリティの観点から単純であるだけでなく、非標準でもあります。クライアントは、彼らが望むあらゆる方法でHTTPを送信することを許可されるべきであり、あなたは正しく応答するべきです。これには検証が含まれます。
サーバー側の検証も重要です 互換です。ブラウザを使用している場合でも、すべてのユーザーがJavaScriptを有効にするわけではありません。
補遺-2016年12月
データベースの現在の状態に依存するため、サーバー側のアプリケーションコードでは適切に実行できず、クライアント側のコードでは完全に検証できない検証があります。たとえば、「他の誰もそのユーザー名を登録していません」、「コメントしているブログ投稿はまだ存在しています」、「要求された日付と重複する既存の予約はありません」、「アカウントの残高はまだその購入をカバーするのに十分です」 」データベースだけが、関連データに依存するデータを確実に検証できます。開発者は定期的にこれを台無しにしますが、PostgreSQLはいくつかの優れたソリューションを提供します。