Table of Contents
XSS
什么是 XSS
跨站点脚本注入 Cross-Site Script Injection。
比如用户在博客的浏览里面写入了一段 html 代码,而这段代码没有做 santize,直接在当前页面执行了。
如何避免
- santize 用户的输入
- 使用 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 给替代了。