-2

データベースとのやり取りでPHPを自分自身で学ぼうとしていて、「単純な」(ほとんどのものは相対的なものである可能性があります...)ログインスクリプトを実行しようとしています。最初に試したときに、session_registerについていくつかのエラーが発生しました$_SESSION['something'] = 'something'; に変更しようとしました。

私のデータベースにはユーザーが設定されています。正常に接続して適切なデータベースを選択できますが、ユーザー名とパスワードを入力すると、ログインフォームに戻ります。これは、失敗したときに行う必要があります。

廃止されたバージョンを使用したときにキャストされた間違ったユーザー名またはパスワードをキャッチする何かがあります。main_login.php、checklogin.php、login_success.php の 3 つのファイルがあり、以下に投稿します。

main_login.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>
<head>
    <meta http-equiv='content-type' content='application/xhtml+xml; charset=UTF-8' />

    <title>Login</title>
    <!-- JAVASCRIPTS -->
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="script/jquery.js"></script>
    <!-- CSS FILES -->
    <link rel='stylesheet' type='text/css' href='css/default.css' />
</head>
<body>
    <div id='wrapper'>
        <div id='loginform'>
            <form action="checklogin.php" method='post' id='login'>
                Username: <br />
                <input type='text' name='username' /><br />
                Password: <br />
                <input type='text' name='password' /><br />
                <input type='submit' value='Login' />
            </form>
        </div>
    </div>
</body>

checklogin.php

<?PHP
//Server/database settings
ob_start();
$host       = "localhost";
$username   = "root";
$password   = "";
$db_name    = "user";
$tbl_name   = "userdata";

//Connect to the server and select the database
mysql_connect("$host", "$username", "$password") or die ("cannot connect");
mysql_select_db("$db_name") or die ("cannot select DB");

//Get the username and password from the login form
//Prevent SQL injections
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string(md5($_POST['password']));
$username = stripslashes($username);
$password = stripslashes($password);
//$username = mysql_real_escape_string($username);
//$password = mysql_real_escape_string($password);
$sql = "SELECT * FROM $tbl_name WHERE username = '$username'
and password = '$password'";
$result = mysql_query($sql);

//Count the table row. 0 = No user exists
$count = mysql_num_rows($result);

//If $result is 1 the user exists
if($count == 1) {
    $_SESSION['username'] = '$username';
    $_SESSION['password'] = '$password';
    header('location:login_success.php');
}

/*  //If the result match the $username && $password, table row will be 1
if($count == 1) {
    session_register('username');
    session_register('password');
    header('location:login_success.php');
}*/

//If it does not match, give a return message
else {
    echo 'Wrong Username or Password';
}
ob_end_flush();
?>

そして最後の login_success.php

<?PHP
session_start();
if (!isset($_SESSION['username'])) {
    header('location:main_login.php');
}
?>
<html>
    <body>
        Login Successful
    </body>
</html>

これにより、ログインページに戻ります:/

また、SQL インジェクションに対して脆弱なコードに気付いた場合は、遠慮なく指摘して、代わりに何をすべきかを提案してください。

4

3 に答える 3

2

さて、session_start()checklogin.php に呼び出しがありません。

そして、何らかの理由で、前に行を適用したエスケープそのものを削除しているため、コードは実際にインジェクションに対して脆弱です。なぜこのstripslashes()電話?

また、mysql_real_escape_string()それ自体で注射を防止するものではないことに注意してください。
適切にフォーマットされたデータだけがインジェクションを防ぐことができ、1 つではなく、ほぼ 10 のフォーマット ルールがあります。
ただし、引用符で囲まれた文字列のみをクエリに追加し、すべての文字列を に渡す限りmysql_real_escape_string()、クエリは完全に安全です。

于 2012-12-25T18:38:22.047 に答える
1
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

あなたの常識が言ったようsession_start()に、の冒頭に追加してくださいchecklogin.php

于 2012-12-25T18:37:09.767 に答える
0

引用符を削除します。

$_SESSION['username'] = '$username';
$_SESSION['password'] = '$password';

と置換する:

$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

交換

ob_start();

と:

session_start();
ob_start();

なぜこれを削除したのですか?

//$username = mysql_real_escape_string($username);
//$password = mysql_real_escape_string($password);

これは非常に必要です。そうしないと、コードが SQL インジェクションに対して脆弱になります。

于 2012-12-25T18:38:56.037 に答える