03.不安全的过滤导致 XSS
如果不安全地过滤输入,特别是对<script>
标签的不安全过滤,可能导致 XSS(跨站脚本攻击)漏洞。XSS 攻击是一种利用网页应用程序未正确过滤或转义用户输入的情况下,将恶意脚本注入到网页中并在用户浏览器上执行的攻击。
#
示例代码:func(writer http.ResponseWriter, request *http.Request) { var name = request.URL.Query().Get("name") scriptRegex := regexp.MustCompile("(?i)<script>") name = scriptRegex.ReplaceAllString(name, "") scriptEndRegex := regexp.MustCompile("(?i)</script>") name = scriptEndRegex.ReplaceAllString(name, "") writer.Write([]byte(fmt.Sprintf(`<html>Hello %v</html>`, name)))
#
攻击示例:可以通过双写<script>
标签的方式来绕过,这样当<script>
标签被过滤掉,剩下的组合起来刚好形成一个完整的 payload。
http://127.0.0.1:8787/xss/replace/nocase?name=<scr<script>ipt>alert("hello yakit")</scr</script>ipt>#过滤后变成<script>alert("Hello Yakit")</script>
利用 iframe 标签
http://127.0.0.1:8787/xss/replace/nocase?name=<iframe src="javascript:alert('Hello Yakit')">
#
防御措施:要防止此类 XSS 攻击,不应仅仅对<script>
标签和</script>
标签进行过滤。正确的做法是对用户输入进行全面的输入验证和输出编码。具体措施如下:
- 输入验证: 对用户输入进行验证,只接受符合特定格式和类型的数据。拒绝包含特殊字符或 HTML 标签的输入。
- 输出编码: 在将用户输入显示在网页上之前,进行适当的输出编码,将特殊字符转换为对应的 HTML 实体,以防止恶意脚本的执行。可以使用合适的编码函数,如在 Python 中使用
html.escape
。 - CSP: 使用内容安全策略(CSP)来限制网页中加载的资源,只允许从指定源加载内容,有助于减少 XSS 攻击的成功率。