0
<?php
class test_class {

        public function __construct() { 

        }
        public function doLogin($username,$password) {

            include("connection.php");

            $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_escape_string($username)."'
                      AND password = '".mysql_escape_string($password)."'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {

            return 'no';
            }
            else 
                {
            return 'yes';
                }
            }


}
?>

上記のコードは機能しますが、安全かどうか少し心配です。

注: 私は POST メソッドを使用していないため、関数内の引数として受け取る必要があり、使用できません。

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];
4

6 に答える 6

5

コードは安全かもしれませんが、実装は良くありません。認証パスワードをプレーンテキストとして保存しないでください。ソルトしてハッシュする必要があります。

理由を説明するのに 1 時間費やすこともできますが、これを読んだ方がよいでしょう。

于 2009-05-27T10:49:07.230 に答える
4

クエリ自体は安全に見えますが、PDO や Zend_Db などのパラメーター バインドをサポートする DB インターフェイスを使用した場合は、すべての SQL ステートメントをそれほど神経質に精査する必要はありません。

また、mysql-* 関数はほとんど非推奨です。代わりに mysqli-* 関数を確認する必要があります。

スタイル上の補足として、空のコンストラクターには意味がありません。文字列値ではなく、ブール値の true または false を返すことをお勧めします。

最後に、他の場所で述べたように、平文のパスワードを保存することは悪い考えです。

于 2009-05-27T10:49:11.957 に答える
2

ええと....平文のパスワードを保存していますか?それは確かに安全ではありません。パスワードは、sha256 などを使用してソルトでハッシュする必要があります。プレーンテキストのパスワードを保存することは決して良い考えではありません。

于 2009-05-27T10:47:13.897 に答える
1

いいえ。生のパスワードをデータベースに保存するべきではありません。ハッシュ化して保存します(できればソルトを使用)。さらに、準備されたステートメントは、エスケープするよりも優れた選択です。このPHP PDO ドキュメントを参照してください。(セキュリティ以外の) 追加の利点として、より効率的になります。

于 2009-05-27T10:46:45.287 に答える
1

コード自体は問題ないように見えますが、主な問題はパスワードをプレーン テキストで渡していることです。

クライアントからサーバーへの接続は安全ですか (つまり、SSL を使用) サーバーからデータベースへの接続は安全ですか

どちらの場合でも、だれかがネットワークに座ってトラフィックを監視できる場合は、セキュリティ上の問題があります。

私だったら、間違いなくクライアントとサーバーの間に SSL 接続を確立します。

パスワードのハッシュをデータベースに保存していることを確認します。

そして、私はあなたのコードを次のように変更します

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid
于 2009-05-27T10:50:54.840 に答える
-3

問題ないと思いますが、セキュリティが心配なら、「username」のパスワードを変数に格納して、クエリの外で比較してみます。

于 2009-05-27T10:39:18.360 に答える