1

Web ページのログイン システムを初めて作成し、セキュリティについて調べようとしましたが、それが正しいかどうかわかりません。

これまでのところ、ユーザー名/パスワードが保存されており、パスワードは sha256 と 3 文字のソルトでハッシュされています。ユーザー名とパスワードが正しい場合、次のような新しいセッション ID を作成します

session_regenerate_id (); 
$_SESSION['valid'] = 1;
$_SESSION['userid'] = $userid;

私がチェックするすべてのページで

function isLoggedIn()
{
if(isset($_SESSION['valid']) && $_SESSION['valid'])
    return true;
return false;
}

これを使用して、正しいユーザーを確認します

$username = $_POST['username'];
$password = $_POST['password'];
//connect to the database here
connect();
//save username
$username = mysql_real_escape_string($username);
//query the database for the username provided
$query = "SELECT password, salt
    FROM users
    WHERE username = '$username';";
$result = mysql_query($query);
if(mysql_num_rows($result) < 1) //no such user exists
{
  //show incorrect login message
}
//check the password is correct for the username found
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password']) //incorrect password
{
  //show incorrect login message
}
else
{
//setup a new session 
validateUser();
//redirect to the main page
header('Location: main.php');
die();

false の場合、ログイン ページに送り返されます。これは十分に安全ですか?

メインページにはhtmlリンクもあります

  <li><a href="main.php">Home page</a>

これらのリンクが使用されている場合、メイン ページの php スクリプトを終了する必要がありますか?

4

5 に答える 5

4

phpdevが言ったことに追加します。十分に安全に見えますが、お勧めすることがいくつかあります。

ユーザーを特定のページに送りたいときは、スクリプトが終了して実行を終了していることを確認してください。たとえば、次のようにします。

if (!isLoggedIn()){
   header('Location: login.php');
}
//It's wrong to assume that things are safe here
echo $secret_data;

そのため、必ず電話の後にexit();またはを追加してください。die();header()

また、ハッシュするときは、ユーザーごとに一意のソルトを使用するようにしてください。そのため、テーブルに追加の列を作成して、ハッシュされたパスワードの隣にusers保存する必要があります。PHPasssaltなど、十分にテストされたハッシュ用のライブラリを使用することも強くお勧めします。

同じドメインを使用して同じWebサーバーで異なるWebサービスを実行し てmysite.com/my_super_awesome_appいる場合mysite.com/my_not_very_awesome_app:$_SESSION$_SESSION['app1_valid']session_set_cookie_params()

于 2012-07-13T10:00:47.707 に答える
3

はい、それは私には安全に見えます。session_start()何かを行う前に必ず呼び出して、設定する場所に注意してください$_SESSION['valid']。正しいユーザー名とパスワードを入力したことを確認した後にのみ設定されていることを確認してください。

ソルトに関しては、ユーザーごとに 10 文字程度の独自のソルトを提案します。次に、フグ アルゴリズム (bcrypt) でcryptを使用して結果をハッシュします。BCrypt は、ハッシュを計算するコストが徐々に高くなるように設計されています。これは、誰かがパスワード ハッシュを盗んだ場合に重要です。

于 2012-07-13T09:45:05.327 に答える
2

ログインフォームからHTTPSを要求することを忘れないでください。そうしないと、これはすべて無料です。

于 2012-07-13T20:00:28.527 に答える
0

パスワードのセキュリティに関しては、考慮すべきことがたくさんあります。残念ながら、sha-256 はまだ bcrypt や scrypt に勝てません (ハードウェアの改善に役立つように、キー ストレッチング、ソルト、およびスケーラブルなワーク ファクターを実装しています)。

openwall (http://www.openwall.com/phpass/) の PHPass をチェックアウトしたいと思います。これは非常に標準的な bcrypt ライブラリであり、使いやすいものです。

他の人が言っているように、ログイン ページが HTTPS で保護されていない限り、パスワードは盗聴される可能性があります。

あなたが session_id を再生成していることが気に入っています。この場合は問題にならないかもしれませんが、セッション リプレイ攻撃やセッション固定攻撃を防ぐのに役立ちます。

一般的に、システムをより安全にするために考慮すべきその他の事項:

  • パスワード ポリシー
    • パスワードの長さ
    • 数字 + 特殊文字
  • パスフレーズ
    • 単語が一般的でないことを確認できれば、より多くのエントロピーが得られる可能性があります
  • ログイン失敗後の禁止
  • 二要素認証の追加
于 2012-07-14T04:54:58.270 に答える
0

基本的なアプリには問題ないようです。あなたができることは他にもたくさんあります。タイマー。辞書攻撃。ログイン試行セッション。SO を検索します。

function is_customer_logged_in() {
    if($_COOKIE['GC_CUST_LOGIN']==1 && $_SESSION["loggedIn"]=="1"){
        return true;
    }else{
        return false;
    }
}

$_SESSION["time"]=time();
setcookie("GC_CUST_LOGIN", 1, ".stackoverflow.com");
$_SESSION["loggedIn"]="1";
$_SESSION["loggedIn_Md5_Hash"]=md5(hash);

セッションのハッシュを挿入し、ログインしているかどうかを確認して番号を追加し、Cookie とセッションを使用してデータベース チェック後に一致を強制することもできます。

于 2012-07-13T10:03:39.603 に答える