示例:
数据库连接和过滤器
//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语句,还是只接受您可以验证为未被修改的内容之间的区别。