この例では、プリペアドステートメントを省略しますが、SQLインジェクションの防止について調査する必要があります。
まず、ユーザーがログインに使用するフォームが必要です。これが、NewUser.htmlというページに表示される基本的なフォームです。
<form action="AddUser.php" method="POST">
<p>Enter A Username: </p>
<input type="text" name="User" maxlength="20" size="10">
<br />
<p>Enter A Password: </p>
<input type="password" name="Password" maxlength="40" size="10">
<br />
<p>Enter Password Again: </p>
<input type="password" name="PasswordX2" maxlength="40" size="10">
<br />
<input type="submit" value="Create Account">
</form>
もちろん、メールアドレスなどの他のフィールドを追加することもできますが、私はそれをシンプルにしています。
次に、AddUser.phpページに移動しましょう:
<?php
//Now let's grab our $_POST data from our form and assign them to variables...
$User = $_POST['User'];
$PW = $_POST['Password'];
$PW2 = $_POST['PasswordX2'];
//Check whether user put anything in the fields for user or passwords
if (!$User || !$PW || !$PW2) {
echo "You have not entered all the needed info. Please try again.";
exit();
}
//Check if passwords match
if ($PW <> $PW2) {
echo "Your passwords do not match. Please go back and try again.";
exit();
}
//Now we want to be good stewards of passwords and information so let's hash that password
$hash = password_hash($PW, PASSWORD_BCRYPT);
//Open your connection to database
$dbconnect-> blah blah(make your database connection here)....
//Now let's insert the new user into the database - remember do not do this without SQL-injection prevention. I'm just giving you the basics.
$sql = "INSERT INTO UsersTable (UserName, Password)
VALUES ('".$User."', '".$hash."')";
//Verify Successful Entry
if (mysqli_query($dbconnect,$sql)) {
echo "User Added Successfully";
} else {
echo "Error Creating User: " . mysqli_error($dbconnect);
}
echo "<br /><p>Please go to the main page to login now.</p>";
?>
これでユーザーが作成され、パスワードがソルトでハッシュされてDBに挿入されました...SQLインジェクションを真剣に忘れないでください。
これで、ログイン用のNewUser.htmlフォームと非常によく似たフォームが作成されますが、パスワードを2回入力する必要はありません。ログインフォームがユーザーをlogin.phpというページに送信するとします。
<?php
session_start(); //starts a session for tracking user on each page - this has to be on every page
//Let's get our variables from the POST data- will be identical to before most likely
$User = $_POST['User'];
$PW = $_POST['Password'];
//Open your connection to database
$dbconnect-> blah blah(make your database connection here)....
//Let's see if the username and password matches what we have in the database
$sql = "SELECT UsersTable.UserName, UsersTable.Password
FROM UsersTable
WHERE UsersTable.UserName = '$User'";
$result = $dbconnect->query($sql);
//Let's get the hashed password that corresponds to that username
$row = $result->fetch_assoc();
$HashedPassword = $row['Password'];
//Let's verify the password is correct
if (password_verify($PW, $HashedPassword))
{
//if it is correct(true) this will now happen
$_SESSION['verified_user'] = $User; //registers user by storing it in a SESSION
}
else {
echo "Login failed. Try again.";
exit();
}
?>
ヒントとして、アクセスレベルを追加する場合は、アクセス番号(例:1、2、3)を使用してデータベースに場所を保存し、ログインに成功すると、アクセスレベルを表す別の$_SESSIONを割り当てます。許可した特定のセクションにアクセスできるようにします。
これで、サイトの他のページに移動すると、セッションは次のように確認されます。
ExamplePage.php
<?php
session_start();
if (isset($_SESSION['verified_user'])) {
//User is verified and whatever is here will be visible and happen- YAY!
}
else {
echo "You are not logged in and cannot see this page.";
}
?>
ログインしている人だけがアクセスを許可されているすべてのページでセッションを開始する習慣を身に付けてください。セッションはページごとに記憶されます。
セッションを破壊するログアウトページを提供することを忘れないでください:logout.php
<?php
session_start();
unset($_SESSION['verified_user']);
session_destroy();
echo "You are logged out.";
?>