Web 安全这件事情比你想象的非常常见。比如今年10月的美国东海岸大规模互联网断网事件。就是黑客入侵,通过网络对美国互联网域名解析服务商Dyn公司进行攻击。 所有作为开发者我们需要学习和了解从攻击者和防御者两个角度去看待Web安全。
攻击篇
- XSS
它主要是通过盲目的信任用户提交的内容。通过提交的内容加入盲目的把string的内容转成DOM。
特点:很难从UI上感知。(可能暗地执行脚本) 窃取用户信息(cookie/token) 绘制UI,诱骗用户点击。
根据性质可分为:
存储型(Stored XSS)特点:恶意脚本被存在数据库中。 当用户访问对应页面时去数据库中请求读取数据,这时就会获得用户账户的内容。 这种危害最大,对全部用户可见。
反射型(Reflected XSS)特点:它涉及数据库,而是从URL进行入侵。它不需要服务器的参与,全部是都是在浏览器中完成。
突变型(Mutation-based XSS)特点:利用了浏览器渲染DOM的特性。不同浏览器,会有区别。也可以说是按浏览器进行攻击
- 跨站请求伪造(Cross-site request forgery)
在用户不知情的前提下,利用用户权限,去执行指定的HTTP请求,窃取或者修改用户信息。
请求方式:
常见的有GET请求。就是通过一个a标签,点击即可触发,或在通过img标签,当图片加载完成之后就会完成GET请求。
SQL Injection: 就是通过将请求字段直接以字符串的形式拼接SQL语句,如下
public async renderForm(ctx){//这个是获取用户名和表单id。
const { username, form_id }= ctx,query;
const result = await sql.queryl //以字符串的形式拼接SQL语句
SELECT a,b,c FROM table
WHERE username =${ username }
AND form_id = ${ form_id }
`);
ctx.body = renderForm(result);
}
但Injection 不止于SQL 还有CLI , OS command ,Server-Side Request Forgery(这个严格上来讲并不是injection,但原理类似)
- Denial of Service(DoS) 通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,导致服务器崩溃。
正则表达式:重复匹配时满足一个即可与尽量多
const greedyRegExp = /a+/;
const nonGreedyRegExp = /a+?/;
const str = "aaaaaa";
console. log(str.match(greedyRegExp)[0]); // "aaaaaa"
console.log(str.match(nonGreedyRegExp)[0]); // "a"
这时攻击者通过贪婪匹配行为,由于我们使用一个贪婪表达式进行匹配,攻击者加入一个特定的字符串,当进行匹配时会进行回溯,会发现永远匹配不上从而一直回溯。影响响应时间,接口的吞吐量下降
- Distributed DOS(DDOS) 在短时间内,使用大量僵尸设备进行请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效应,无法响应新请求。
特点:不会限制在域名访问,而是使用直接访问IP不会区分接口,目的是消耗带宽
总结
如今,Web安全很常见并且危害很大。要去保证自己写的代码不会被作为漏洞进行攻击。所有要去了解经典的Web安全攻击方法。以此为鉴,去完善代码。