在很多企业应用中,用户登录及验证普遍存在。从用户数据存储的方式来看,一般有数据库存储、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的程序,我们可以在网络上普遍搜集到相关的代码。
分享到:
相关推荐
微信小程序登录流程详解 微信小程序登录是微信官方提供的一种登录能力...微信小程序登录流程是一个非常重要的知识点,开发者需要充分理解和掌握微信小程序登录流程的每一个步骤,才能更好地实现用户登录和应用安全性。
9. **泛型**:泛型引入了类型参数,提高了代码的类型安全性和可读性,避免了强制类型转换。 10. **反射机制**:Java的反射机制允许在运行时检查类的信息,创建和调用类的对象,增强了程序的灵活性。 11. **枚举与...
编制银行家算法通用程序,并检测思考题中所给状态的安全性。
从编程的圈子跳出来,了解从较高的应用程序架构级别处理安全性的新方法。跑在安全违规行为的前面,帮助确保您企业的高度安全性。大部分软件安全性的讨论都集中在应用程序本身或其中包含的数据上。例如,大家经常讨论...
以下是对《信息安全原理与实践》第二版课后思考题解析整理的一些核心知识点。 ### 一、信息安全基本概念 #### 1. 信息安全定义 信息安全是指保护信息及信息系统免受未经授权的访问、使用、泄露、中断、修改或破坏...
- **渗透测试**:模拟真实攻击来测试系统的安全性。 - **安全运营**:建立持续的安全监控和响应机制。 **2. 安全设计介入时间和方式** - 在项目的初期阶段就开始考虑安全问题,并将其融入到整个开发流程中。 **3. ...
尤其在Web应用开发领域,开发者不仅要关注应用程序的功能实现,还需要深入思考如何确保数据传输和存储的安全性。这不仅仅是为了防止数据泄露或被恶意篡改,也是为了维护企业和用户的信任。 #### 技术架构与安全考量...
Java 具有平台无关性、安全机制、高可靠性、多线程和内嵌网络支持的特性,拥有一些 C/C++ 的大部分优点,同时又简单易学,已经成为了“21 世纪首选的应用程序开发工具”。 一、Java 程序设计语言的特点 Java 程序...
2.2 用户指定适当的权限,系统管理员需要思考给用户指定什么样的权限,以避免影响服务器安全性和用户工作效率。 保障学校教学网络的安全性是 schools networks management 的一个重要组成部分。系统管理员需要贯穿...
为了成功实现微信小程序在银行业务中的应用,IT部门需要设计和实施有效的策略,包括数据安全、用户隐私保护、系统稳定性及扩展性等。 论文期刊在推动行业知识传播方面发挥了重要作用。关于微信小程序的论文,通常会...
在安全响应中,正确设置Content-Type有助于确保数据传输的安全性和准确性。 #### 3.5 其他技术点 报告中还提到了其他一些技术点,如“ 0 BA2OSS”、“6.948 =<+>D”等,这些可能是特定场景下的技术细节或者是...
整个文档以首都机场的数据为例,展示了飞行程序设计的实际应用,并提出了未来系统改进的思考方向,强调了自动化设计系统在提高设计效率、精度和安全性上的价值。 总的来说,飞行程序设计是一门综合了航空理论、地理...
4. **安全性**:加入了简单的登录验证机制,增加了程序的安全性。 ### 五、扩展思考 为了进一步提高此通讯录管理小程序的功能性和用户体验,可以考虑增加以下几个方面的改进: 1. **数据持久化**:将通讯录数据...
例如,网络法律法规的制定和执行需要遵循公正和透明的程序,以保护用户的隐私权和数据安全,促进公平竞争,确保网络空间的健康发展。因此,理解行政程序的价值和实施方式对于理解网络领域的法规制定和执行至关重要。
这些安全问题按照漏洞危害性分类,高危漏洞占比最高,其次是中危漏洞;按攻击途径分类,远程漏洞的比例高于本地漏洞。信创数据库面临的漏洞类型多样,主要包括信息泄露、拒绝服务、未授权访问、缓冲区溢出等多种类型...
智能手机传感器的安全性问题,首先是由于恶意程序的入侵。这些恶意程序通常会通过用户不注意时点击的钓鱼链接或其他恶意软件进入用户的手机系统中。一旦这些恶意软件获得对传感器的控制权,它们便可以越过手机的...
在架构设计方面,百度智能小程序平台考虑了性能、安全性、开放性、开发者生态和合作伙伴生态等方面的挑战。为了提升整体平台性能,平台进行了多项优化,如原生页面转场、原生组件和API的开源以及支持一次开发多平台...