-1

我在这里学习 php 和 OOP 编程。我正在尝试修改以下工作代码以防止 sql 注入。其他人向我展示了如何使用 PDO 的想法。但我很难让它发挥作用。

基本上这个功能是通过$uid$password检查用户。我究竟做错了什么?

用户函数.php

<?php

class DB_Functions {

    private $db;

    function __construct() {

        require_once 'db_connect.php';

        $this->db = new DB_Connect();
        $this->db->connect();
    }

    public function getUser($uid, $password) {
        $result = mysql_query("SELECT * FROM users WHERE id = '$uid' AND pswd = '$password'") or die(mysql_error());

        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {

            $result = mysql_fetch_array($result);
            return $result;    

        } else {

            return false;
        }
    }

}

?>

修改代码

<?php

class DB_Functions {

    private $db;

    function __construct() {

        require_once 'db_connect.php';

        $this->db = new DB_Connect();
        $this->db->connect();
    }

    public function getUser($uid, $password) {
        $stmt = $db->prepare("SELECT * FROM users WHERE id=? AND pswd=?");
        $stmt->execute(array($uid, $password));
        return $stmt->fetch();
    }

}

?>

检查用户(index.php)

require_once 'include/db_functions.php';
$db = new DB_Functions();


if ($tag == 'login') {

    $uid =mysql_real_escape_string($_POST['id']);
    $password =mysql_real_escape_string($_POST['pswd']);

    // check for user
    $user = $db->getUser($uid, $password);

    if ($user != false) {

        $response["success"] = 1;
        $response["user"]["id"] = $user["id"];

        echo json_encode($response);
    } else {

        $response["error"] = 1;
        $response["error_msg"] = "Incorrect email or password!";
        echo json_encode($response);
    }
4

2 回答 2

3

您完全错过了 PDO 的重点。通过使用占位符正确准备的查询,您不必自己进行任何转义。

同样, mysql_real_escape_string() 依赖于建立的活动数据库连接mysql_connect()。没有它,您的 m_r_e_s() 将无法工作,并且会为“失败”返回布尔值 false。然后,您尝试在查询中使用这些错误值。

由 PDO 建立的 DB 连接不能与 mysql_ ()、mysqli_ () 等共享。这些库中的每一个都维护着自己独立的连接池。

于 2012-08-21T18:59:49.280 回答
2

您正在使用 PDO,因此您不能使用mysql_real_escape_string(). 您不需要转义参数,因为 PDO 会在您准备好的查询中自动为您转义它们。

因此,只需getUser()像这样调用:

if ($tag == 'login') {

    // check for user
    $user = $db->getUser( $_POST['id'], $_POST['pswd']);

    ... etc
于 2012-08-21T19:00:17.040 回答