安全
sql 注入
攻击者在 web 应用的输入参数中注入恶意 SQL 代码,从而执行未授权的数据库操作,比如,访问、删除、修改数据。
防御方法:
- 参数化查询,输入验证。
- 移除或转义特殊字符,比如单引号。
- 校验输入。
- 不拼接 SQL,比如使用 ORM 框架的参数化查询。
- 限制数据库权限
- 不能使用 root 用户。为数据库用户分配最小的必要权限。
- 定期进行安全审计和漏洞扫描。
XSS
Cross-Site Scripting (XSS) 是一种注入类攻击,指攻击者通过在网页中注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。
主要分类:
反射型,Reflected XSS Attacks
攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击。 因为这个过程就像一次反射,故称为 反射型 XSS 。
攻击步骤
- 攻击构造出特殊的 URL ,其中包含恶意代码。
- 用户被诱导打开带有恶意代码的 URL ,服务器端将恶意代码从 URL 中取出当做参数处理,然后返回给用户带有恶意代码的数据。
- 用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
存储型,Stored XSS Attacks
当浏览器请求数据时,脚本从服务器传回并执行。它是最危险的一种跨站脚本,比 反射性XSS和 DOM型XSS 都更有隐蔽性,因为它不需要用户手动触发。任何允许用户存储数据的 Web 程序都可能存在存储型 XSS 漏洞。若某个页面遭受存储型 XSS 攻击,所有访问该页面的用户都会被 XSS 攻击 。
存储型 XSS 跟 反射型 XSS 的区别是:
- 存储型 XSS 的恶意代码存在服务器上, 反射型 XSS 的恶意代码存在 URL 里。
- 存储型 XSS 攻击时恶意脚本会存储在目标服务器上。
攻击步骤
- 攻击者把恶意代码提交到目标网站的服务器中。
- 用户打开目标网站,网站服务器端把带有恶意代码的数据取出,当做正常数据返回给用户。
- 用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型,DOM Based XSS。
DOM 型 XSS 形成原因是通过修改页面的 DOM 节点形成的 XSS。 DOM 型 XSS 攻击中,取出和执行恶意代码都由浏览器端完成,属于前端自身的安全漏洞。
攻击步骤
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户被诱导打开带有恶意代码的 URL。
- 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
防范
Content Security Policy
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
- 禁止加载外域代码,防止复杂的攻击逻辑。
- 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
- 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
- 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
- 合理使用上报可以及时发现 XSS,利于尽快修复问题。
HttpOnly 防止劫取 Cookie
输入检查
不要相信用户的任何输入。 对于用户的任何输入要进行检查、过滤和转义。
- 建立可信任的字符和 HTML 标签白名单,对于不在白名单之列的字符或者标签进行过滤或编码。
- 在 XSS 防御中,输入检查一般是检查用户输入的数据中是否包含 <,> 等特殊字符,如果存在,则对特殊字符进行过滤或编码,这种方式也称为 XSS Filter。
const decodingMap = {
'<': '<',
'>': '>',
'"': '"',
'&': '&',
' ': '\n'
}
输出检查
用户的输入会存在问题,服务端的输出也会存在问题。一般来说,除富文本的输出外,在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。例如利用 sanitize-html对输出内容进行有规则的过滤之后再输出到页面中。