这个脚本可以改进吗?

时间:2010-12-07 16:15:48

标签: php security design-patterns

好的,我想知道存储在user_login.php中的代码是否可以改进,或者我是否做错了。我很困惑,因为应用程序中的所有脚本都只有30-40行,我想知道我是否遗漏了什么。

使用ajax调用调用此脚本,就像我的应用程序中的其他人一样,除了模板文件。

<?php

# Ignore
if (!defined('APP_ON')) { die('Silence...'); }

# Gets the variables sent
$user_name = post('user_name');
$user_password = extra_crypt(post('user_password'));

# Check if the user exists
if (!user::check($user_name, $user_password)) { template::bad($lang['incorrect_login']); }

# Logging in
$id = user::get_id($user_name, $user_password);
$u = new user($id);
$u->login();
template::good($lang['correct_login']);

?>

我要解释一下:

# Ignore
if (!defined('APP_ON')) { die('Silence...'); }

这基本上检查文件是不是直接调用的。每个URL都被重定向到一个index.php文件,该文件管理网址(es:www.mysite.com/user/view/id/1)并包含正确的文件。在这个index.php文件的第一行中有一个define('APP_ON', true);。索引文件还初始化应用程序,调用一些函数和一些类。

# Gets the variables sent
$user_name = post('user_name');
$user_password = extra_crypt(post('user_password'));

函数post()管理$ _POST ['user_name']的恢复,进行一些检查。 函数extra_crypt()只使用sha1和自定义alghoritm来加密密码。 我正在为sql查询使用预准备语句,所以不要担心转义后变量。

# Check if the user exists
if (!user::check($user_name, $user_password)) { template::bad($lang['incorrect_login']);

user类包含静态和普通方法。静态方法不需要id来启动,普通方法也是如此。例如,user::check();会检查数据库中是否存在用户名和密码。 template类只有两个静态方法(template::bad()template::good()),它们管理快速对话框,无需任何页眉或页脚即可发送给用户。相反,如果您实例化类$t = new template('user_view'),则会调用模板user_view_body.php,您可以使用$t->assign()管理该页面,将静态变量分配给模板,或者使用$t->loop()开始循环等 最后$lang是一个数组,其中包含用户设置语言中的一些常用字符串。

# Logging in
$id = user::get_id($user_name, $user_password);
$u = new user($id);
$u->login();
template::good($lang['correct_login']);

最后我们有实际的登录信息。实例化user类并恢复id。具有该ID的用户已登录,我们向用户返回template::good()消息框。 如有任何澄清,请在上面写上评论。

2 个答案:

答案 0 :(得分:3)

首先,像sha1这样的消息摘要功能不是加密功能。因此,请从函数名称中删除crypt以避免混淆。此外,用于存储密码的“自定义算法”的整个想法吓坏了我。 sha256是比sha1更好的选择,但sha1在它仍然是NIST批准的功能之后并不是那么糟糕。与md5不同,没有人能够为sha1生成冲突(尽管这将在新的几年内发生)。如果你确实使用sha1,请确保salt是一个前缀,以阻止前缀攻击。

输入验证必须始终在使用时完成。 post()函数应该负责任何输入验证或转义。这只是magic_quotes_gpc的一个化身,因为它的安全列车正在被删除。

像PDO和ADODB这样的参数化查询库非常好,我建议使用它。这是使用时消毒的一个很好的例子。

您的模板assign()方法可用于清理XSS。 Smarty附带一个htmlspecialchars输出过滤器模块,可以执行此操作。

答案 1 :(得分:1)

由于你没有提供的功能背后有如此多的功能,很难说是否需要修复任何东西。您确定post()中的输入是否干净?您的数据库是否在user::check()中保持安全?您是否使用会话cookie来简化用户首选项/信息存储?你的template课程写得好吗?创建新用户时,是否记录了所有必要信息(登录时间,IP地址,必要时等)?您是否确保用户没有双重登录,如果这在那里很重要?

我能告诉你的关于你所写的唯一具体事情是sha1 algorithm is completely broken,而你应该使用别的东西;请参阅以下评论以获取建议。