0

ログインシステムを作成する方法についてのチュートリアル「安全なログインシステムを正しい方法で作成する」に従っています。コードではmysql_real_escape_string、ユーザー名フィールドをクエリとしてデータベースに渡す前に使用します。つまり、

$username = mysql_real_escape_string($username);

データベースに何も追加していないので、これは必要ですか?このユーザーがすでに存在するかどうかを確認するだけですか?

とにかくそのままにしておくのではない理由は、上記のコードを使用すると、テキストが空白になり、空の文字列がデータベースに送信されるためです。なぜなのかわからないので、省略できればと思いました。

以下は、コメント投稿者からデータベース接続を開いていることに関するアドバイスです(パスワードなどが変更されています)。

function dbConnect(){
    $connection = mysql_connect('localhost', 'username', 'password');
    $database=mysql_select_db('database', $connection);

    return $connection;
}

$username = $_POST['username'];
$password = $_POST['password'];
$password = md5($password);

$username = mysql_real_escape_string($username);

$query = mysql_query("SELECT *
      FROM members
      WHERE username = '$username'
      AND password = '$password'",dbConnect());
4

3 に答える 3

1

プリペアドステートメントでPDOを使用することをお勧めします。プリペアドステートメントはSQLクエリのプレースホルダーのようなもので、後でそれらの場所に挿入されるデータを送信します。これにより、エスケープする文字列は廃止されます。

上記のコメントですでに述べたように、ユーザー入力を含むすべてのSQLクエリは、SQLインジェクション攻撃に対して脆弱です。

于 2012-05-02T18:26:44.210 に答える
1

適切なコードは次のとおりです。

dbConnect();
$username = mysql_real_escape_string($_POST['username']);
$password = md5($_POST['password']);

$sql = "SELECT * FROM members WHERE username = '$username' AND password = '$password'";
$res = mysql_query($sql) or trigger_error(mysql_error().$sql);
于 2012-05-02T19:22:01.027 に答える
0

はいusername、SQLで許可されていない特殊文字が含まれている可能性'があるため、必要/ です。

例:

'ユーザー名をエスケープしないMcDonald'sと、不正なSQLステートメントが発生します。

select * from your_table where username = 'McDonald's'
于 2012-05-02T18:19:53.820 に答える