php和mysql登录脚本错误

时间:2012-10-27 15:49:12

标签: php mysql sql security

我已经制作了一个php登录脚本,但它不起作用。

我的代码:

<?php

function clean($str) { /* sanatize strings for databases & security */
  $str = trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

if (!empty($_POST['login_admin'])) {

    $username = clean($_POST['name']);
    $password = clean($_POST['password']);

      try {
        $dbh = new PDO('mysql:host=localhost;dbname=imedia', "imedia", "imedia");

        $statement = $dbh->prepare("SELECT * FROM administratori WHERE username =:username AND parola =:password");
        $statement->execute(array(":username" => $username, ":password" => md5($password)));
        $row = $statement->fetch();
        if ($row) {
            session_start("imedia_admin");
            $_SESSION['imedia_admin']['logname'] = $row['username'];
            $_SESSION['imedia_admin']['password'] = $row['password'];
            echo json_encode("success");
        } else {
            echo json_encode("error");
        }

        $dbh = null;
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
}
?>

问题出现在clean函数中,如果不使用它,我的代码有效,任何人都可以解释一下我的错误吗?

2 个答案:

答案 0 :(得分:4)

PDO会处理它(它会自动转义单引号或为您清理它)。不要使用您自己的clean函数传递变量。

这是发生了什么。

  • 假设你有这个字符串hello world's day
  • 传递给您的功能clean使其成为hello world''s day
  • 然后在PDO上再次将其转义为hello world''''s day
  • 导致(不匹配hello world's day不等于hello world''s day

答案 1 :(得分:3)

由于您使用的是预先准备好的声明,并因此将价值出价,因此您无需自己“清理”字符串。

这是使用预准备语句和变量绑定的美女之一;它们是开箱即用的。


mysql_real_escape_string将转义$_POST['name']$username)中的特殊字符,这会在您搜索数据库时导致不匹配(因为使用PDO传递的值被视为“是“)。

mysql_real_escape_string也已弃用,请访问php.net了解替代方法。