2016-05-11 14 views
0

このログインスクリプトの脆弱性に関する少しの情報を探します。このログインをクッキーで安全に使用できますか?

ステップ1 - ユーザ名とパスワードを使用して、入力フォームは

を提出します

ステップ2 - ユーザーを検証するためにチェックDBに記録されます - 私はステップ3は

DBと呼ばれるセッションにuniqidを挿入する検証時に

$user_decode_cookie = base64_decode($_COOKIE['cookiewithinfo']); 

$cookie_implode = (explode('_', mysqli_real_escape_string($con, $user_decode_cookie))); 

$sql = mysql_query("SELECT * FROM user WHERE username='{$cookie_implode[0]}' AND session = '{$cookie_implode[1]}'")or die(mysql_error()); 
    $userinfo = mysql_fetch_array($sql); 
    return $userinfo; 

ステップ4 - それを確認するには、ユーザー名とuniqid

でCOOKIEを設定するには、私はクッキーを取得し、確認uniqのを作る正しいユーザでありますidはDB内のユーザー名と一致します。

私はここで少し読んで、私が見たようにセッションを使用しました。

ブラウザを閉じてもログインを保存するためにCOOKIESを使用していました。

これはいくぶん安全にやり遂げる方法、または私が昼食に行く方法に近いですか?どんな入力にも感謝します。

+3

セキュリティ上の問題のため、 'mysql_ *'は 'PHP7'から廃止されました。 'mysqli_ *'や 'PDO'拡張に切り替えることをお勧めします。 –

+0

良いキャッチ、私はいつも今はやっているが、これはちょうど好奇心の外にコピーとペーストthx – Tianbo84

答えて

1

あなたのアプローチはかなり安全です。私が変える唯一のことは、$uniqidの代わりにmd5(PK . $uniqid)を保存して、ボットネットと何年もの試行をしてもそれを強制することはほとんど不可能であるということです。

PKは、単純にあなたのスクリプトに非公開にしておく簡単なキーです。 DBをそのままにしておけば、クエリーの後にPHPでセキュアなセッションキーを検証するか、現在のクエリーを保持するために同じセキュアなキーを直接DBに格納することができます。

セキュリティのために引数にprepared statementを使用する必要があることに注意してください。

+0

本当に誰かが実際のクッキーをハイジャックした場合に引き継ぐこのセッションのための唯一の方法ですか?返信をしてくれてありがとうございます。悪意のある攻撃のエンコードと乱数を投げ、制限されたログイン試行を追加することを考えてください。 – Tianbo84

+0

私が提案した準備文を使用する場合、ハイジャックする唯一の方法は、おそらく何世紀もの処理を達成するエンコードされたIDを推測することです。 –

+0

エンコーディングを追加すると、すでに使用している実際のIDよりも大きなIDが表示されます。目に見えない鍵に依存し、md5のハッシングがかなり正規分布になっているため、構築が推測できないので、ブルートフォースプロセスを短縮することは不可能です。 –

関連する問題