如何提高登录脚本?

我怎样才能保证我的登录脚本是安全的,使它更好,这是我的第一个代码:

帮助最赞赏。

<?php include ('../includes/db_connect.php'); $firstname = $_POST['firstname']; $lastname = $_POST['lastname']; $email = $_POST['email']; $mobile = $_POST['mobile']; $username = $_POST['username']; $password = md5($_POST['password']); // lets check to see if the username already exists $checkuser = mysql_query("SELECT username FROM users WHERE username='$username'"); $username_exist = mysql_num_rows($checkuser); if($username_exist > 0){ echo "I'm sorry but the username you specified has already been taken. Please pick another one."; unset($username); header("Location: /registration?registration=false"); exit(); } // lf no errors present with the username // use a query to insert the data into the database. $query = "INSERT INTO users (firstname, lastname, email, mobile, username, password) VALUES('$firstname', '$lastname','$email', '$mobile','$username', '$password')"; mysql_query($query) or die(mysql_error()); mysql_close(); echo "You have successfully Registered"; header("Location: /registration?registration=true"); // mail user their information //$yoursite = ‘www.blahblah.com’; //$webmaster = ‘yourname’; //$youremail = ‘youremail’; // //$subject = "You have successfully registered at $yoursite..."; //$message = "Dear $firstname, you are now registered at our web site. // To login, simply go to our web page and enter in the following details in the login form: // Username: $username // Password: $password // // Please print this information out and store it for future reference. // // Thanks, // $webmaster"; // //mail($email, $subject, $message, "From: $yoursite <$youremail>\nX-Mailer:PHP/" . phpversion()); // //echo "Your information has been mailed to your email address."; ?>

--------------解决方案-------------

按照Artefacto的有关SQL注入和散列密码的数据库中的建议。 其他事情 ...

echo "I'm sorry but the username you specified has already been taken. Please pick another one.";
unset($username);
header("Location: /registration?registration=false");

不会工作,因为你不能回应然后发送一个头。 头必须在任何输出之前发送。

此外,没有点这样做:

header("Location: /registration?registration=false");
echo "I'm sorry but the username you specified has already been taken. Please pick another one.";
unset($username);

web浏览器将重定向直线距离,用户不会看到你打印的便捷信息。

此外,它通常要求对登记表2密码字段以防用户做了一个错字,并没有注意到,因为所有的文字是*的。 你比较2,如果它们是不同的,你认为一个错字写了,问了。

这不是一个登录脚本。 这是一个注册脚本。

请参阅SQL注入PHP手册。 你的程序很容易受到这种攻击。

此外,不只是or die(mysql_error()) 这将会使你的,你可能不希望暴露(表名称等)的数据库信息。 使用正确的错误处理。 例如,您可以抛出一个异常,并定义一个未捕获的异常处理程序,它显示了一个“糟糕”页面,并记录错误。

最后,使用散列强比MD5算法,如SHA1。

至于说通过@Artefacto,这不是一个登录脚本。 但是,如果你打算做一个登录脚本,我想给你一个建议。 我前一阵子做到了这一点。

:不要做这样的事情的

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

我这样做:

$sql = "SELECT * FROM users WHERE username = '$username'";
$user = //use the php-sql (query, fetch_row) commands to fetch the user row.
if (strcmp($user['password'], $password) == 0) {
//log in success
}

通过这样做,可以避免SQL注入在一个简单而优雅的方式。 你们的想法呢?

重申一下其他人提及。 重要的是要保护自己(和服务器)的SQL注入。 例如:

$checkuser = mysql_query("SELECT username FROM users WHERE username='$username'");

你只是简单采取价值$_POST['username']并把它放在变量$username

有些人不是很漂亮,并会试图打破你的程序:(所以它总是建议逃脱被从用户所采取的任何数据,把它变成一个SQL查询之前。

例如...
本:

$checkuser = mysql_query("SELECT username FROM users WHERE username='$username'");

变为:

$checkuser = mysql_query("SELECT username FROM users WHERE username='" .mysql_real_escape_string($username). "'");

分类:php 时间:2015-03-15 人气:0
本文关键词: PHP,登录
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.149 (s). 10 q(s)