仍然使用PDO参数化查询攻击了SQL注入

我继承了一个老的基于php的网站,不断遭到黑客入侵。 根据我在这里找到的信息:我如何防止PHP中的SQL注入?我更新了使用PDO参数化查询的SQL查询。 我们上周再次遭到黑客攻击,看起来像是一次SQL注入攻击。
所有用户名都从用户表中删除,并用自己的信息替换。 然后,黑客能够进入该网站的管理部分,并造成各种破坏。

参数化查询怎么会发生这种情况?

看到我的代码如下 - 我错过了什么? 我将更改用于此查询的db登录名的权限,以便只允许选择,但我真的想知道为什么查询容易受到攻击。

class pdoConnection
{ 
    var $conn;

    function pdoConnection()
    {               
        $this->createConnection();
    }

        function createConnection()
    {
        try
        {
            $dbConnection = new PDO('mysql:host=mysqlhostname.com;dbname=mydbname;charset=utf8', 
                    'dbusername', 'dbpassword',
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));                   
            $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $dbConnection -> exec('SET NAMES utf8');
            $dbConnection -> exec('SET CHARACTER SET utf8');
            $this->conn =$dbConnection;
        }
        catch(PDOException $e)
        {
            die('Could not connect: ' .$e->getMessage(). "<br><br>");
        }

    }

    //  GET CONNECTION
    //  --------------------------------------------------------------------- 
    function getConnection() 
    {   
        return $this->conn;
    } 

} 

$login = htmlspecialchars($_REQUEST['login'], ENT_QUOTES, 'UTF-8');
$pass =  htmlspecialchars($_REQUEST['pass'], ENT_QUOTES, 'UTF-8');

$msg = '';


//check to see if there is a value
if($login == '' || $pass == '') {
    $error = 1;
    $msg = "Please enter a username and password.<br />";

} 
else 
{
    //try to validate

    $clsPDO = new pdoConnection();
    $con = $clsPDO->getConnection();
    $stmt = $con->prepare('SELECT * FROM users where userName = :login');
    $stmt->execute(array(':login' => $login)) or die($con->errorInfo());
    $row = $stmt->fetch();

    if (isset($row))
    {
        if( $pass == $row['userPassword']) {

            $required_login = $row['userName'];
            $required_pass = $row['userPassword'];
            $userLevel = $row['userLevelID'];
            $userName = $row['userName'];
            $userID = $row['userID'];
        }
        else 
        {
            $error = 1;
            $msg = "Your username/password did not match. Please check your entries and try again.";
        }

    }
    else 
    {
        //did not validate
        $error = 1;
        $msg = "Your username/password did not match. Please check your entries and try again.";
    }

}

我最近调查了关于这个主题的几个讨论和教程,我看不到您的代码中存在任何安全漏洞。 您正在关闭仿真,将字符集设置为已知安全的字符集,并正确使用准备好的语句。 也就是说,想到两点:

  • 您可以确认数据库服务器上正在使用准备好的语句,而不是由PDO模拟。 你告诉它你想要什么,但这与确认它发生的不一样。 字符集配置同上。 您多次尝试正确设置是您不相信系统倾听您的证据。 从我读到的关于该功能的历史记录来看,这是非常可以理解的。

  • 即使有人在您发布的代码中发现了漏洞,但似乎没有足够的理由相信它在这种情况下被利用。 也没有人指出漏洞意味着代码是安全的。 所以,安全似乎在进一步取证的方向上,“下一次”的日志记录增加,以及考虑替代的攻击媒介。

  • 链接地址: http://www.djcxy.com/p/93461.html

    上一篇: still got sql injection hacked using PDO parameterized query

    下一篇: re SQL Injection Attack using MySQL, what are baseline requirements?