好的,我想知道存储在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()
消息框。
如有任何澄清,请在上面写上评论。
答案 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,而你应该使用别的东西;请参阅以下评论以获取建议。