Web 安全中的复杂请求和攻击防范
复杂请求
在对服务端的数据进行更新、删除、创建等操作时,由于这些操作对服务器数据有安全影响,浏览器会在实际请求之前进行一次预检请求。这种预检请求是一个 OPTIONS 请求(预请求 - 权限验证请求),因此服务器程序会多响应一次。预请求只会在跨域的异步请求中出现,因为同源策略主要针对异步请求。
避免 XSS 攻击
XSS 攻击通过在用户浏览器上执行恶意脚本,来盗取用户信息、会话令牌等。预防措施有以下几种:
转义输入输出
确保从用户那里接收的任何输入在输出到页面之前都被适当转义,包括对 HTML、JavaScript、CSS 等的转义。
使用内容安全策略(CSP)
CSP 可以限制网页上可以执行的脚本来源,减少 XSS 攻击的风险。
验证输入
对所有输入进行验证,拒绝任何不符合预期模式的输入。
使用安全框架
许多现代 Web 开发框架(如 React、Angular、Vue 等)已经内置了一些防护措施,自动处理 XSS 攻击。👍
避免直接插入 HTML
尽量避免使用innerHTML
等方法直接插入 HTML 代码,因为这可能会导致未经转义的代码执行。
避免 CSRF 攻击
CSRF 攻击利用了 Web 应用中用户已经通过身份验证的会话,使攻击者能够以用户的名义执行不希望的操作。预防措施有以下几种:
使用 CSRF 令牌
在表单提交或者 AJAX 请求中使用一个随机生成的 CSRF 令牌,服务器验证该令牌以确保请求的合法性。
检查 Referer 头
验证请求的 Referer 头,确保请求来自于信任的源。虽然这种方法并不完全可靠,但可以作为一种额外的检查手段。
使用 SameSite Cookie 属性
将 Cookie 的 SameSite 属性设置为 Strict 或 Lax,可以防止浏览器在跨站请求中发送这些 Cookie,减少 CSRF 攻击的风险。🔒
双重提交 Cookie
使用 Cookie 中的值与表单中的值进行比较,来验证请求的来源。
自定义请求头
在 AJAX 请求中添加一个自定义请求头,并在服务器端验证这个头。由于非简单请求(即跨域请求)会触发预检请求,这可以防止恶意站点发起伪造的请求。