过滤后使用cookie运行数据库查询是否仍然容易受到SQL注入或类似操作的攻击


Would running database queries with cookies after filtering still be vulnerable to SQL Injection or something similar?

示例:

数据库连接和过滤器

//Initialize MySQLi connection
$db = new mysqli($_CONFIG['mysql']['hostname'], $_CONFIG['mysql']['username'], $_CONFIG['mysql']['password'], $_CONFIG['mysql']['database']);
if ($db->connect_errno) {
    die("MySQLi error: ".$db->connect_error);
}
//filter injections
function filter($var)
{
    global $db;
    return $db->real_escape_string(stripslashes(htmlspecialchars($var)));
}

成功登录后设置cookie,检查cookie并每次重新更新

if(login) {
// after successful login
$cookiehash = md5(sha1($_SESSION['user_id'] . $recentIP));
$db->query('UPDATE users SET loginHash = "'.filter($cookiehash).'" WHERE id = '.filter($_SESSION['user_id']).'') or die(mysqli_error($db));
setcookie("customCookie",$cookiehash,time()+3600*24*365,'/','.'.$_SERVER['HTTP_HOST'].'');
}

// if the cookie is set, update expiration and set session id
    CheckCookieLogin() {
            global $db;
            if (!empty($_COOKIE['customCookie'])) {
            $cookie = $_COOKIE['customCookie']; 
            $query = $db->query('SELECT * FROM users WHERE loginHash = "'.filter($cookie).'"');
            if($query->num_rows > 0) {
            $_SESSION['user_id'] = 1;
            // reset expiry date
            setcookie("customCookie",$cookie,time()+3600*24*365,'/','.'.$_SERVER['HTTP_HOST'].'');
            }
        }
    }

这仍然容易受到任何类型的注入攻击吗?

cookie存储在客户端的计算机上,因此很容易受到攻击。所谓的"饼干中毒攻击"。所以要小心对待内容。这似乎是您对filter()例程所做的操作。

然而,它仍然可以改进。如果您可以在不必访问数据库的情况下检查cookie是否已被修改,该怎么办?这看起来可能比实际情况更困难。

一个简单的方法是在cookie的内容中添加某种校验和,这是你可以检查的,但对黑客来说并不明显。黑客首先必须弄清楚你在做什么,然后才能开始更改进入SQL语句的数据。这是接受cookie中的任何内容并将其放入SQL语句,还是只接受您可以验证为未被修改的内容之间的区别。