学习html的时候大家应该在w3school上看到过下面的介绍
Password 对象
Password 对象代表 HTML 表单中的密码字段。
HTML 的 <input type=”password”> 标签在表单上每出现一次,一个 Password 对象就会被创建。
该文本输入字段供用户输入某些敏感的数据,比如密码等。当用户输入的时候,他的输入是被掩盖的(例如使用星号),以防止旁边的人从他背后看到输入的内容。不过需要注意的是,当表单提交时,输入是用*明文发送的。
密码使用明文发送,即在网络的传输的过程中未被加密处理,password作为表单的一个属性值,随着http请求的发送,直接在互联网上传输。
假如你的主机到目标服务器之间,某个环节流量被监控,你的密码就会被别人获取。
如下示意图
主机–>路由器(A)–>路由器(B)<-流量监控(解析http请求,获取password)–>…–>服务器
这种是比较常见的中间人攻击,也是目前安全测试常用的使用方式,抓取http请求,然后分析你的请求数据可以检查敏感数据是否明文传送,同时可以使用平行攻击,即按照传输数据的规则,可以伪装url,获取数据。具体这块的东西有时间再单独写一篇blog吧。现在这里写个引子。
这种最为常见的安全问题,真的有公司掉坑里面吗?
下面列举几个
前面两个公司是比较有名的互联网公司,最后一个为长沙的本土互联网教育公司
我们发现在互联网行业,不管是大公司还是小公司,他们对于安全意识的薄弱。
那么问题来了,怎么破?
常见的解决方案
- 不修改代码
如果不打算修改代码,最简单的办法应该是https了,https保证了传输链路的安全,且数据加密,就算中间拦截了你的http请求,没有密钥也无法查看数据。但是https对服务器的性能还是有一定的影响,而且免费的方案需要定时刷新密钥,且稳定性不能保证。
具体实施可以参考 陈皓大神的这篇文章 如何免费的让网站启用HTTPS - 修改代码
主要是前台使用js或者控件(插件的方式兼容性不太好,而且chrome从53版本后就不支持插件,所以不推荐)进行加密,后台进行解密,从而保证了传输过程中密码不是明文传输的。
其中最关键的步骤是加密的过程,一定要使用非对称加密,且公私钥的产生非常关键
具体的实现方式后续再补充(实践过程中使用过的都是公司采购,需要在互联网上查询开源解决方式) - 使用短信验证码
如果使用密码觉得有风险,目前互联网主流的做法就是使用短信验证码。
避开密码的风险,但是提高了运营的成本。
使用密码必然在传输过程中存在被拦截的风险,如果被“拖库”,同时攻击者知道了你的密码规则,风险就不言而喻了。使用短信验证码鉴权就不会存在这个问题。这也是短信验证码的优势。
同时这个地方有一个API的设计细节需要注意,验证类API不能返回底层信息,只能返回true/false。 切记不可查询信息,然后在前台进行判断!!!
前两种实现方式建议都实践,https好处也不单单是防止中间人攻击,现在运营商劫持流量的情况实在太严重,防止运营商加入弹窗广告,等等。但是也还是按照实际情况来权衡是否开启。
这个只是由password标签的一个引子,后续会继续讲讲安全方面的内容。