安全登录表单,或者至少我希望如此

时间:2016-04-22 13:52:47

标签: php mysql security login

我写了一封新的电子邮件表单。我已经实现了一些好人在这里建议的东西,所以我尽力使它既简单又安全,虽然我不确定我是否成功后者认为我现在仍然坚持使用旧的MySQL API 。我觉得我必须解释原因。这是因为整个网站都在使用mysql而我没有时间切换到PDO,至少目前还没有。

我没有通过!preg_match运行密码,但不确定这是否会使输入容易受到某种攻击?我有一种感觉,当使用!password_verify时,我可以高枕无忧。

登录表单使用昵称,电子邮件和密码登录。

这是我的代码:

if (@$_POST['login']) {
    $nickname = mysql_real_escape_string($_POST['nickname']);
    $email = $_POST['email'];
    $password_input = $_POST['password'];
// validation 1 ------- //
    else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
    $error = "Wrong nickname password or email.";
    }
    else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) {
    $error = "Wrong nickname password or email.";
    }
// validation 2 ------- //  
        else { //password check
        $password_query = mysql_query ("SELECT password FROM userbase WHERE email='$email' && nickname='$nickname'"); 
        $password_actual = mysql_result ($password_query, 0);
        if (!password_verify($password_input, $password_actual)) {
        $error = "Wrong nickname, password or email.";
        }
            else {
            LOGIN SUCCESSFUL

如果被!preg_match转义,$_POST['nickname']需要mysql_real_escape_string吗? (安全老虎钳)

1 个答案:

答案 0 :(得分:1)

即使使用mysql_real_escape_string,MYSQL和MYSQLI函数也极易受SQL注入攻击。

How can I prevent SQL-injection in PHP?

我已将您的代码从MYSQLI转换为PDO,这些SQL语句是由数据库服务器与任何参数分开发送和解析的。

$con = new PDO('mysql:host=localhost;dbname=name', 'user', 'pass');

if ($_POST['login']) {
$nickname = $_POST['nickname'];
$email = $_POST['email'];
$password_input = $_POST['password'];
else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$error = "Wrong nickname password or email.";
}
else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) {
$error = "Wrong nickname password or email.";
}else{ 
$password_query = $stmt = $con->prepare("SELECT password FROM userbase WHERE email=:email && nickname=:nickname"); 
$stmt->bindParam(':email', $email);
$stmt->bindParam(':nickname', $nickname);
$stmt->execute();
if($password_query->rowCount() > 0) {
$row = $stmt->fetch();
if(!password_verify($password_input, $row['password'])) {
$error = "Wrong nickname, password or email.";
}else{
 //LOGIN SUCCESSFUL
}