XSS原名CSS(cross-site script), 但与CSS(cascading style sheet)重名,所以就改名为XSS, 今天我们来了解一下XSS攻击和防御。
XSS的本质是:坏人C写了一个恶意js脚本,然后让好人A的浏览器去执行这个恶意js脚本,从而实现对好人A的攻击。
XSS有持久型、反射型和DOM型。持久型XSS是最好懂的,危害很大,本文会以持久型XSS为例,来说明XSS攻击和防御方法。
持久型XSS也叫存储型XSS, 其攻击思路如图所示,一目了然:
来看一下具体实例, 坏人C发表的微博内容如下:
It is sunny today: <script> alert("xss attack")</script>
当好人A去浏览这条微博内容时,微博服务器的逻辑如下(以Go代码为例):
package main
import (
"io"
"log"
"net/http"
)
func staticFile(w http.ResponseWriter, r *http.Request) {
// 存储的恶意内容
contentFromDB := `It is sunny today: <script> alert("xss attack")</script>`
str := "<html><body>" + contentFromDB + "</body></html>"
io.WriteString(w, str)
}
func main() {
http.HandleFunc("/static", staticFile)
err := http.ListenAndServe("localhost:8080", nil)
if err != nil {
log.Println(err)
}
}
好人A的浏览器要显示微博内容,随即弹框如下:
这个js代码仅仅是一个简单的弹框,没有具体威胁。但是,这足以证明,好人A的浏览器确实执行了坏人C的js代码,那么,坏人C可以制作恶意的js内容,让好人A的浏览器执行,比如获取好人A的cookie信息,然后发送给坏人C的服务器。我们知道,cookie中有很多隐私信息,这样坏人C就能实施破坏活动了:比如恶意发表微博。
在实际开发中,开发人员要增强安全意识,为用户的信息安全保驾护航。这其实就涉及XSS的防御,要对用户输入的特殊信息进行转换和过滤。
看起来简单,其实不然,XSS的变化还是很灵活的,坏人的手段也很多,关于XSS的更多内容,后面慢慢聊。在实际工作中,曾遇到过XSS攻击。
2011年,新浪微博就爆发过XSS攻击(和上述例子有所不同),持续了16分钟,被攻击的用户达到33000多个,危害十分严重:
周末愉快,下次见。