突发奇想,小改动解决安全问题

这几天一直在琢磨用 Perl CGI 架设网站,正好在网上看到了一篇关于 CGI 安全的文章,里面提到了数据库注入和远程执行等等安全问题。也就是说,比较安全的方法是屏蔽一系列特殊字符(比如说,管道“|”、引号“" '”、斜线“/”等等)。今天偶然间突发奇想,如果换一种思路,不需要过滤特殊字符也能做到脚本安全。

具体方法如下。(假设:用户名与密码存在 user 表中,密码用 md5 加密)

[code lang="php" title="Pseudo-code"]
$username = http_get("username"); // Get username from browser
$password = http_get("password"); // Get password from browser

$password = md5($password); // Make md5 hash for password

$mysql->connect(); // Connect to database
// Get all users that have this password

$rows = $mysql->query("SELECT username FROM `user` WHERE password='$password'");

// If no one match, must be username/password problem
while($r = $rows->next()) {
if($r->username == $username) login_success();
}
die("Username/password incorrect!");
[/code]

由于 md5 hash 不包括任何特殊字符,所以这段脚本对数据库无害。

优点总结:由于传递给数据库的字符串当中不包括任何特殊字符,因此没有任何注入危险。

缺点总结:一般来说,用户数据表都是拿用户名做索引,所以按密码查询效率相对低一些。但是考虑到用户登录的频繁程度,这个缺点就无所谓了。

已有 3 条评论
  1. G-NASA~♂ G-NASA~♂

    你是南京电影学院的吗?

  2. snailium snailium

    [quote=G-NASA~♂]你是南京电影学院的吗?[/quote]
    不是……

  3. […] 其中登陆部分采用了《突发奇想,小改动解决安全问题》其中的方法。 […]

添加新评论