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