私は勉強しています
Web Application Security、A Beginner's Guide(英語)ペーパーバック– Bryan Sullivan(著)、Vincent Liu(著)
69ページの「資格情報の検証」では、資格情報を
アプリケーションとデータベースのロジックの違いを理解できません。
「アプリケーションの比較ロジック...」のテキストは次のように述べています。
アプリケーションは、ユーザー名に関連付けられたレコードを取得するために、リクエスト(SQLクエリやLDAPクエリなど)をバックエンドデータベースに送信します...
「データベースの比較ロジック...」のテキストは次のように述べています。
この手法では、指定されたユーザー名とパスワードに対応するフィールドが一致するレコードを返すようバックエンドに要求する条件ステートメントを使用して、SQLクエリまたはLDAPリクエストをバックエンドシステムに作成します
両者の違いがわかりません。アプリケーションは、条件付きステートメントを使用して、バックエンドシステムへのSQLクエリまたはLDAPリクエストも作成すると思います。
これをどのように視覚化できますか?ありがとう!
次のように考えてください。
ほとんどのシステムには複数のコンポーネントがあります。従来のセットアップでは、これは通常、ユーザー、サーバー、およびデータベースに配布されるクライアントです。
データベースは通常、他の誰かが作成した、一般的に使用され、高度に最適化されたソフトウェアですが、サーバーは、クライアントのニーズに合わせて特別に作成されたカスタムソフトウェアであることがよくあります
この例では、サーバーはクライアントと通信します。データベースがクライアントと直接通信する場合、クライアント(およびユーザー)がすべてのデータにアクセスできるため、通常はシステムが非常に安全でなくなります。
クライアントは、データベースに入力された詳細を確認するように要求するリクエストをサーバーに送信します。クライアントが検証されると、サーバーは、クライアントが表示できる情報、クライアントが再検証することなくそのデータを要求できる期間、送信されるデータの量などを決定します。
例としてグーグルを見てください。検索クエリをグーグルすると、Webページ(クライアント)が開きます。クライアントは、Googleとやり取りしているときにサーバーと通信し、サーバーは提案を送り返し、最終的には質問への回答を提供しますが、クライアントとしてのユーザーはGoogleのすべての情報にアクセスする必要はなく、Googleのサーバーのみが持つ必要がありますこのすべての情報へのアクセス、そしてあなたが知る必要があるものだけを示すべきです。
別のアナロジー、レストランにいるとき、あなたはクライアント、ウェイターはサーバー、それはあなたが何を必要としているのかを理解し、キッチン(データベース)に何を調理するかを伝え、準備ができたらそれを持ってくるでしょう結果。それはまさにサーバーが行うことです。
さらに質問をしてください:-)
質問のどちらの方法も「with plaintext passwords」を扱います。これは非常に悪い考えです。しかし、説明の目的で物事を明確にするのに役立ちます。
アプリケーションの比較ロジック:
$result = sql_query('SELECT users.password FROM users WHERE userId = %i', $userId);
if ($result['password'] == $userPassword) {
print 'access granted';
} else {
print 'wrong credentials';
}
データベースの比較ロジック:
$result = sql_query('SELECT (users.password = %s) AS passwordOk FROM users WHERE userId = %i', $userPassword, $userId);
if ($result['passwordOk'] == 1) {
print 'access granted';
} else {
print 'wrong credentials';
}
2番目のオプションの安全性が低いと見なされる理由はいくつかあります。セキュリティ上重要なクエリをデータベースサーバーに送信する際の一般的な問題は、クエリ 非常に簡単にログファイルに記録される可能性があります です。その他の問題は、ほとんどのデータベースサーバーが強力なパスワードハッシュアルゴリズム(BCryptなど)を実装しておらず、代わりに汎用ハッシュアルゴリズムしか提供していないという事実に起因しています。
お役に立てれば
アプリケーション
アプリケーションは、アプリケーションコードロジックを介して、アプリケーションのデータフローのペイロードとしてサーバーに資格情報を提供します。
データベース
接続はデータベースに直接接続し、資格情報を確認するためにデータベースコマンドを発行します。