在很多企业应用中,用户登录及验证普遍存在。从用户数据存储的方式来看,一般有数据库存储、LDAP/AD、文件存储等。
很显然,在关系数据库发达的年代,单就其保密性和安全性方面来说,文件存储已经基本上可以不用考虑。
数据库存储用户资料,是目前比较流行的存储方式,软件开发人员可以直接将用户名称及对应的密码存储到数据库中的两个字段中。然后,我们可以通过类似下面的SQL语言来实现用户验证:
select * from user where username='name' and password='password';
在UI设计上,我们一般提供一个文本框用来输入用户ID,用一个密码框来输入密码。然后通过变量传递的方式,传送至server端进行验证,服务端类似的验证SQL脚本可能是:
String sql = "select * from user where username='" + userName + "' and password='" + password + "'";
通过返回的数据集的size可以判断当前用户存在与否,以此来检查和验证用户。
咋一看,一切都很自然,也比较合理。殊不知,安全隐患由此产生:
1. 用户密码原文存储
虽然数据库一直是一个比较隐秘的部分,但是如果把密码老老实实的填写在password这个字段上,用户的密码就赤裸裸的暴露给数据库管理员或第三方知道数据库登陆密码的用户。现实中,不缺少那种诚恳的用户,使用自己的银行密码、保险箱密码等作为自己登录密码。而这一切,可能就成为了另外一个对你有企图的人的重要资料。
所以,无论如何,请不要将用户的密码直接存储在数据库中,你完全可以使用MD5, SHA等密码加密方式加密后,再存储到password字段。
那有人问了,如果用户密码丢了,要找回密码怎么办?很简单,直接创建一个新的密码,加密存储,然后提供给终端用户。
2. SQL语句注入威胁
那上面的那个例子来说,如果我在UI上的用户输入框中输入"name' and '1'='1",这会出现什么后果?你可以去尝试,这样会取出你数据库中所有的用户数据,如若你的程序处理不当,可能就给了人家绕过密码验证的捷径。
这还算比较轻的了,如果输入的是"name'; delete from user; select * from user where '1'='1",这样会出现什么后果?你的用户资料全部被恶意的删除了。那你的数据库还安全吗?
如何解决这种SQL注入的问题?可以从两方面入手:
1). 字符客户端或服务端验证,确保输入的用户名的长度,以及里面是否含有特殊字符。
2). 修改你的SQL语句的构造方法,不要采用直接字符串连接的方式来构造你的SQL语句,你可以采用其他的方式。如Hibernate,你不要使用hsql的查询方式来直接查询,你可以通过主键定位的方式先获取到这个User对象,然后在判断密码是否正确;另外,可以采用建立criteria, query对象的方式来直接查询验证。如:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.add(
Restrictions.eq("username", userName)).add(
Restrictions.eq("password", password));
List userList = this.hibernateTemplate.findByCriteria(detachedCriteria);
if (userList.size() == 1) {
return (User) userList.get(0);
} else {
return null;
}
此处我们不考虑连接传输的安全问题,如使用密码客户端加密,https的安全连接等。
至于LDAP和AD,这也是我们经常用到的,应该说是一种非常安全、高效、灵活的用户验证手段。相关的连接LDAP或AD的程序,我们可以在网络上普遍搜集到相关的代码。
分享到:
相关推荐
编制银行家算法通用程序,并检测思考题中所给状态的安全性。
从编程的圈子跳出来,了解从较高的应用程序架构级别处理安全性的新方法。跑在安全违规行为的前面,帮助确保您企业的高度安全性。大部分软件安全性的讨论都集中在应用程序本身或其中包含的数据上。例如,大家经常讨论...
信息安全复习100题 1收集充分的证据,论述计算机病毒的特征。(p178) 1.寄生性(依附性) 计算机病毒是一种特殊的计算机程序,它不是以独立的文件的形式存在的,它寄生在合法的程序中. 病毒所寄生的合法程序被...
1.下列关于计算机病毒的...具有破坏性,并可以在计算机中潜伏、传播的特殊小程序 C.特殊微生物 D.源程序 3.下列关于计算机病毒的说法中,正确的一条是 C 。 A.计算机病毒是一种有损计算机操作人员身体健康的生物病毒
(1) 进程 已分配资源数下列状态是否安全?(三个进程共享12个同类资源) 最大需求数 1 1 4 (状态a) 2 4 4 3 5 8 1 1 4 2 4 6 (状态b) 3 6 8 (2) 考虑下列系统状态 分配矩阵 最大需求矩阵 可用资源矩阵 0 0...
Web 应用程序安全性也不例外。 您必须了解 Web 应用程序(老板)如何与您的浏览器(角色)交互并开始模糊测试 Web 应用程序以确定它容易受到哪些攻击。 想象一个二维横向卷轴,除了它教玩家安全和渗透测试。 货叉
Java是简单性的、面向对象、分布式、健壮性、安全性、平台独立、可移植性的、多线程、动态性的。它的应用使软件开发过程更加灵活,提高了软件质量,增强了软件可重用性。在当今网络技术迅速发展的情况下,Java已成为...
3) 掌握安全性检查流程。 5.3 实验描述 本实验主要对操作系统中的死锁预防部分的理论进行实验。要求实验者设计一个程序,该程序可对每一次资源申请采用银行家算法进行分配。 5.4 实验内容 1) 设计多个资源(≥3); ...
Java是简单性的、面向对象、分布式、健壮性、安全性、平台独立、可移植性的、多线程、动态性的。它的应用使软件开发过程更加灵活,提高了软件质量,增强了软件可重用性。在当今网络技术迅速发展的情况下,Java已成为...
在模糊测试中,用随机坏数据(也称做 fuzz)攻击一个程序,然后等着观察哪里遭到了破坏。...由这个测试验证过的失败模式通常对程序员来说是个彻底的震撼,因为任何按逻辑思考的人都不会想到这种失败。
ApacheShiro是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。...Shiro的核心设计模型,来源于大多数人对应用安全性思考,即在相关(某类人或事)背景下实现与应用的安全性交互。
思考 1 网络安全的概念 网络安全就是要保护网络用户的信息安全及利益 ,给用户提供一个可信赖的网络环境,网络安全主要包括网络系统中的硬件、软件和在网络上传输的各种信息的安全,使这些内容不要遭受偶然的、有意...
9-l 一个典型的场景 9-2 使用TDCoMConnection建立MTS/COM+对象 9-3 维护事务管理的正确性 9-4 MTS/COM+应用系统架构的实现 9-5 第二种思考方式 9-6 结论第10章 撰写高效率的MTS/COM+组件和MTS/COM+应用系统 10-1 你...
9-3 维护事务管理的正确性 9-4 MTS/COM+应用系统架构的实现 9-5 第二种思考方式 9-6 结论 第10章 撰写高效率的MTS/COM+组件和MTS/COM+应用系统 10-1 你应该牢记的事情 10-2 快速建立和调用远程MTS/COM+对象 ...
本书循序渐进、深入浅出地介绍了Perl的主要特性及用Perl进行CGI编程的知识。...18.3 Web安全性 211 18.3.1 建立传输明码文本的连接 211 18.3.2 注意不安全数据 212 18.3.3 从事无法执行的操作 213 18.3.4 拒绝...
21.2.5 带有安全性的cookie 247 21.3 cookie存在的问题 247 21.3.1 cookie的生存期很短 247 21.3.2 并非所有浏览器都支持cookie 247 21.3.3 有些人不喜欢cookie 247 21.4 课时小结 248 21.5 课外作业 248 ...
18.3 Web安全性 211 18.3.1 建立传输明码文本的连接 211 18.3.2 注意不安全数据 212 18.3.3 从事无法执行的操作 213 18.3.4 拒绝服务 213 18.4 宾客留言簿 214 18.5 课时小结 215 18.6 课外作业 215 18.6.1 专家答疑...
18.3 Web安全性 211 18.3.1 建立传输明码文本的连接 211 18.3.2 注意不安全数据 212 18.3.3 从事无法执行的操作 213 18.3.4 拒绝服务 213 18.4 宾客留言簿 214 18.5 课时小结 215 18.6 课外作业 215 18.6.1 专家答疑...
18.3 Web安全性 211 18.3.1 建立传输明码文本的连接 211 18.3.2 注意不安全数据 212 18.3.3 从事无法执行的操作 213 18.3.4 拒绝服务 213 18.4 宾客留言簿 214 18.5 课时小结 215 18.6 课外作业 215 18.6.1 专家答疑...