02-反射型跨站脚本缺陷
2025/1/1大约 3 分钟安全开发安全开发应用安全
反射型跨站脚本缺陷 - 腾讯安全代码审计实战系列02
反射型跨站脚本(XSS)是一种常见的Web安全漏洞,主要由于Web应用程序对用户输入缺乏适当的验证和编码。当攻击者成功将恶意脚本注入到网页中时,这些脚本会在未经授权的情况下被执行,可能导致以下危害: 1. 网络钓鱼,包括盗取用户账户信息。 2. 窃取用户的Cookies和其他敏感会话数据。 3. 劫持用户会话,获取用户身份。 4. 强制弹出广告页面或进行流量劫持。 该漏洞常现于Web应用程序直接返回用户输入的情形。当用户访问受影响的链接时,恶意代码会被反射并在用户浏览器中执行。
修复建议
- 在输出所有用户可控的数据时,对数据进行HTML转义或编码,以防止恶意代码执行。 2. 使用安全的库或方法进行HTML编码,例如ASP.NET的AntiXSS库或System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode方法。 3. 对所有用户输入进行验证,确保仅包含预期内容,避免任何HTML标签或JavaScript代码被接受。 4. 实施内容安全策略(CSP)以限制浏览器执行的资源,从而减少XSS攻击面。
示例代码
using Microsoft.AspNetCore.Http;
using System.Text.Encodings.Web;
/// bad:直接将用户输入传递给WriteAsync方法,没有进行HTML编码,容易引发XSS攻击
public async Task DisplayEmployeeIDAsync(HttpContext context) {
string userInput = context.Request.Query["id"];
await context.Response.WriteAsync(userInput); // 用户输入直接输出到响应中,未进行任何处理
}
/// good:使用HtmlEncoder.Default.Encode方法对用户输入进行HTML编码
public async Task DisplayEmployeeIDAsyncSecure(HttpContext context) {
string userInput = context.Request.Query["id"];
string safeOutput = HtmlEncoder.Default.Encode(userInput); // 使用HtmlEncoder进行HTML编码
await context.Response.WriteAsync(safeOutput);
}
/// good:验证用户输入,确保输入内容不包含非法字符
public async Task DisplayEmployeeIDWithValidationAsync(HttpContext context) {
string userInput = context.Request.Query["id"];
if (IsValidInput(userInput)) { // 自定义的IsValidInput方法来验证输入
string safeOutput = HtmlEncoder.Default.Encode(userInput);
await context.Response.WriteAsync(safeOutput);
} else {
// 处理非法输入,例如提示错误
await context.Response.WriteAsync("Invalid input detected.");
}
}
private bool IsValidInput(string input) {
// 检查输入是否仅包含允许的字符
return !string.IsNullOrEmpty(input) && input.All(c => char.IsLetterOrDigit(c));
}