1

我制作了一个 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出在功能上,如果不使用它,我的代码可以工作,有人可以解释一下我做错了什么吗?

4

2 回答 2

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
于 2012-10-27T15:54:07.587 回答
3

由于您使用的是准备好的语句,因此将您的值加入其中,因此无需自己“清理”字符串。

这是使用准备好的语句和变量绑定的优点之一;它们开箱即用是安全的。


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

mysql_real_escape_string也已弃用,请查看 php.net 以获取替代方法。

于 2012-10-27T15:55:24.613 回答