5

私のウェブアプリの一部として。これは私が検討しているコードです(私は最高のPHPプログラマーではありませんが、プロジェクト用に独自のアプリをプログラミングしています):

// Start session
session_start();
// Is the user already logged in?
if (isset($_SESSION['username'])) {
    header('Location: members-only-page.php');
}

私のログイン構造がこのようなものである場合、これは安全かどうかを知りたいです。

私はMD5()を使用しています。しかし、スクリプトが使用する$ _session ["user"]="1"アプローチ全体に完全に満足しているわけではありません。確かにvBulletinのようなものはこれをしませんか?

返信に感謝します。私はこれがAjaxhaであるという考えにさえ触れていません!

更新-私のアプローチの疑似コード。SSLのすべて。

// vars
login string post
password string post

// validation aside from ajax now
login string is empty
redirect to login form with error
password string is empty
redirect to login form with error

// mysql
escape strings
clean html strings

mysql connect external mysql server
if login string is user
    if password md5 match with database md5
        session logged in
    else
        session failed password invalid
        redirect to login form user/pass error
    end if
else
    session failed username invalid
    redirect to login form user/pass error
end if

if file called direct
    redirect 404
    alert_admin function type hacking attempt login page
end if
4

1 に答える 1

3
  1. mysql_real_escape_string()すべての形式のSQLインジェクション、またはその他の種類の攻撃からユーザーを保護するわけではありません。多くのセーフガードを個別に防ぐためのコードを組み込んだシステムを使用する必要があります。これは、テストサーバーで使用している例です(本番環境には十分な強度がありません)。

    function sanitize($str)
    {
      $str = trim($str);
    
      if (get_magic_quotes_gpc())
        $str = stripslashes($str);
    
      return htmlentities(mysql_real_escape_string($str));
    }
    

この質問に対する受け入れられた回答を読んで、ユーザー入力をフィルタリングする方法が完全に証明されない理由を確認してください。

-

ユーザーログインの保護に関する情報については、次のヒントを考慮してください。

  1. 可能な限り、不可能な場合はユーザー入力を避けてください。入力をサニタイズします。
  2. ユーザーパスワードの保護にmd5 のみを使用しないでください。復号化するのは簡単です。
    • 個々のユーザーに固有のパスワードソルトの使用を検討してください。
  3. 自分のパスワードは長く、多様なものにしてください。
    • オプションで、これらをユーザーのパスワードへの提案として拡張します。例:
      • 長さは6文字以上である必要があります。
      • 文字の大文字と小文字が混在している必要があります。
      • 少なくとも1つの数字が含まれている必要があります。
      • (安全)少なくとも1つの記号が含まれている必要があります。

パスワード強度に関する理論的根拠と統計:

私は(nVidia NVS 3100Mモバイルグラフィックスカードを使用して)、毎秒56,900,000パスワードの速度でMD5またはSHA1ハッシュをクラックまたは「ブルートフォース」することができます。これは、完全な(a-zA-Z0-9 +記号)文字セットを使用して、1〜6文字の長さのすべてのパスワードを完成できることを意味します。4分未満で。まともなコンピューター(ゲーム用のコンピューターでも)やサーバーを持っている人ができることを想像してみてください。

これを防ぐ方法は、パスワードをソルトすることです。パスワードをどのようにソルトするかに応じて、「攻撃者」は、ユーザーのパスワードを推測する前に、さまざまな方法で復号化を試みる必要があります。パスワードがソルトされていない場合、上記の方法でブルートフォース攻撃を行う可能性があります。

PHPセッションセキュリティについてもっと読む:

PHPセキュリティガイド-セッションセキュリティ

PHPセッションセキュリティ(StackOverflow)

セッションセキュリティに関する注記(SitePoint)

また、何の価値もありません:

あなたはあなたのウェブサイトが何に対して保護される必要があるかを決める必要があります。ウェブサイトが共有サーバーまたは共有ホスティング(VPN、VPS、またはある種の半専用ソリューション)でホストされている場合、システム上の他の悪意のあるユーザーがPHPファイルにアクセスするリスクが常にあります。そして拡張によって; MySQLデータベース。専用サーバー上でも、適切な内部ネットワークセキュリティがなければ、同じように困惑します。

于 2011-11-14T09:58:38.417 に答える