これはウェブサイトの認証スクリプトです。これは安全ですか?最近のプログラミングですか?それは時代遅れですか? 「より安全な方法」があります。私は非常に新しいですが、ヘッダーの承認を使用する場所があまりにも多くないとは思われません。このログインスクリプトは良い/現在/安全ですか?
助けていただけたら幸いです!これは私が今まで作成した最初のログインスクリプトと登録です。しかし、私はヘッダーの承認が気に入らないと思います。
<?php
require_once('connectvars.php');
IF (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Register"');
exit('<h3> You must enter your username & password to continue');
}
$Dbc = mysqli_connect('localhost', 'root', '', 'learn');
$user_username = mysqli_real_escape_string($Dbc, trim($_SERVER['PHP_AUTH_USER']));
$user_password = mysqli_real_escape_string($Dbc, trim($_SERVER['PHP_AUTH_PW']));
$query = "SELECT ID, Username from members where Username = '$user_username' AND " .
"Password = SHA1('$user_password')";
$data = mysqli_query($Dbc, $query);
if (mysqli_num_rows($data) == 1) {
$row = mysqli_fetch_array($data);
$user_id = $row['ID'];
$username = $row['Username'];
}
else {
header('http/1.1 401 unauthorized');
header('www-authenticate: basic realm="Register"');
}
echo ('<p class="Login"> yo are logged in as ' . $user_username . '.</p>');
if (isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
if (empty($username)){
echo "you forgot to enter a username.</br>";
}
if (empty($password)) {
echo "you forgot to enter a password.</br>";
}
if (empty($email)) {
echo "you forgot to enter an email.</br>";
}
if(!empty($username) && !empty($password) && !empty($email)) {
$dbc = mysqli_connect('localhost', 'root', '', 'learn');
$checkusername = 'SELECT username FROM members where username = "'.$username.'"';
if (mysqli_num_rows(mysqli_query($dbc, $checkusername)) != 0)
{
echo "<font color = red> Username <font color = black><u> $username</u></font> already exists in the database.</font></br>";
$checkemail = 'Select email FROM members where email = "'.$email.'"';
if (mysqli_num_rows(mysqli_query($dbc, $checkemail)) != 0)
echo "<font color = red> Email <font color = black><u> $email</u></font> already exists in the database.</font>";
mysqli_close($dbc);
}
else
{
$query = "INSERT INTO members VALUES (0, '$username', SHA1('$password'), '$email')";
mysqli_query($dbc, $query);
echo " Username: <font color = green ><u> $username</u></font> & Password: <font color = green><u> $password</u></font> have been added to the database.";
mysqli_close($dbc);
}
}
}
?>
一見すると、私が選ぶことがいくつかあります。決して$ _POST変数が設定されていると仮定しないでください。コードは絶対にひどくフォーマットされています。 (コピー/貼り付けが間違っていない限り)。そして、SQLインジェクションにはオープンです。とにかく、これにはcodereview.stackexchange.comが適しています。 – Corbin
あなたも塩ですべきです。 – xanadont
@ xanadont彼はおそらくsha1を使用していないはずです。しかし塩漬けは間違いなく改善になるだろう。 – Corbin