常见的浏览器安全防御

Database and Ruby, Python, History


Table of Contents

XSS

什么是 XSS

跨站点脚本注入 Cross-Site Script Injection。

比如用户在博客的浏览里面写入了一段 html 代码,而这段代码没有做 santize,直接在当前页面执行了。

如何避免

  1. santize 用户的输入
  2. 使用 Content Security Policy,即阻止内联脚本执行并向浏览器提供允许的受信任源。

在 Rails 中,可以通过修改config/initializers/content_security_policy.rb来开启 CSP。

Rails.application.configure do
  config.content_security_policy do |policy|
    policy.script_src  :self
  end
end

这样配置之后,inline 的 script 就会被被执行了。在浏览器 console 里面,还会看到这样的报错信息。

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-Gbk2jOuwutsI3g6EfcgcW9JahIvQgzGA2EPFLtabUZI='), or a nonce ('nonce-...') is required to enable inline execution.

HttpOnly

浏览器禁止页面的 JavaScript 访问带有 HttpOnly 的 Cookie,这样可以避免 Cookie 劫持,或者别人拿到 Cookie。很多 XSS 脚本都要先拿到这样的 Cookie,再继续攻击。

XSSFilter

对于输入和输出都要进行过滤,而且要注意代码不要和变量进行拼装,防止变量的内容被执行。

CSRF

验证码

通过验证码,比如 Google 的 recaptcha,可以有效避免 CSRF,但用户体验不好。

csrf_token

CSRF 攻击的本质就是能够猜到所有的参数,那么就多加一个 token,让 token 尽量随机,不可以被猜到就行了。

点击劫持

在页面上放置一块浮动的不可见的 frame,用户看上去是输入到背后的文本框,实际上是输入了那个不见的 frame,导致了密码被盗。

X-Frame-Options

比如设置为SAMEORIGIN的时候,当前页面只能够被嵌套到同源域名下,已经被 CSP 给替代了。

SQL 注入

文件上传