私が作成したログインシステムは攻撃に対して脆弱かどうか常に疑問に思っています。
他の多くのプログラマーと同じように、私もセッションを使用して特定のトークントークンを保持し、ログインステータスを認識しています。ユーザー名またはいつか保存されたステータスを保持するためのCookie。
私が疑問に思っているのは、これは正しい方法ですか?これより良いアプローチはありますか?
私が作成したログインシステムは攻撃に対して脆弱かどうか常に疑問に思っています。
他の多くのプログラマーと同じように、私もセッションを使用して特定のトークントークンを保持し、ログインステータスを認識しています。ユーザー名またはいつか保存されたステータスを保持するためのCookie。
私が疑問に思っているのは、これは正しい方法ですか?これより良いアプローチはありますか?
セッションで独自のカスタム チェックを作成できます。同じユーザー エージェントによって、同じ IP アドレスから作成されていることを確認してください。
それ以外は、セッションはかなり堅実です。
ログインセクションでは、次のようにします。
$_SESSION['_user_agent'] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['_remote_addr'] = $_SERVER['REMOTE_ADDR'];
そして、すべてのリクエストでチェックを行うことができます:
function sessionIsOK ()
{
return ($_SESSION['_user_agent'] == $_SERVER['HTTP_USER_AGENT'] &&
$_SESSION['_remote_addr'] == $_SERVER['REMOTE_ADDR']);
}
httpsを使用しているかどうかが重要だと思います。httpsの代わりにhttpを使用している場合、システムには多くの脆弱性があります。たとえば、リプレイ、man-in-the-middle/relayなどです。
一般的な PHP ログイン システムに代わるものとして、HTTP 認証があります。これには、セッション/Cookie を使用する必要はありません。特に、HTTP ダイジェスト認証は、暗号化されていない <form> ログインよりも安全です。(ほとんどの共有ホスティング プロバイダーは SSL を提供していません。また、ほとんどの FLOSS Web アプリケーションが SSL を設定することはめったにありません。)
ただし、DHTML/AJAX を頻繁に使用することによってのみ軽減できるユーザビリティの欠点がいくつかあります。また、サーバーのパフォーマンスが少し低下します。そして最も重要なことは、ほとんどのプログラマにとって適切に実装するのは難しすぎるということです。
単純な PHP ログイン システムで十分かどうかは、アプリケーションのタイプによって異なります。