
1) 【一句话结论】
在Web服务端开发中,防止SQL注入、XSS、CSRF等攻击需采用“输入验证+输出编码+令牌机制+动态防护”的多层次策略,结合360安全产品的行为分析、动态防护技术,设计安全的API接口,确保用户数据安全。
2) 【原理/概念讲解】
老师口吻解释关键概念:
<script)和输出编码(将特殊字符转换为HTML实体,如<转<)。类比:输入验证是“检查输入有没有坏人”,输出编码是“把坏人变成无害的符号”。3) 【对比与适用场景】
| 攻击类型 | 定义 | 原理 | 常见场景 | 防护手段 |
|---|---|---|---|---|
| SQL注入 | 恶意注入SQL语句,篡改查询结果 | 将用户输入拼接到SQL语句中,绕过验证执行非法操作 | 用户注册、登录、查询等涉及数据库的接口 | 参数化查询、预编译语句、白名单过滤 |
| XSS | 注入恶意脚本,在用户浏览器执行 | 用户输入被当作HTML/JS执行 | 用户评论、个人主页、表单输入等 | 输入验证(正则、白名单)、输出编码(HTML实体转换) |
| CSRF | 伪造用户请求,绕过认证 | 攻击者诱导用户访问恶意链接,提交非法请求 | 修改密码、支付、删除等敏感操作 | CSRF令牌、Referer检查、SameSite Cookie |
4) 【示例】
SQL注入防护(参数化查询):
# 伪代码(Python示例)
def get_user_info(user_id):
sql = "SELECT * FROM users WHERE id = ?" # 占位符
params = [user_id] # 参数单独传递
result = db.execute(sql, params).fetchone() # 数据库解析参数,不会执行SQL
return result
恶意输入:1' OR '1'='1,参数化查询后,数据库解析为id = 1' OR '1'='1,不会执行。
XSS防护(输入验证+输出编码):
# 输入验证:检查输入是否包含script标签
user_input = request.get('comment')
if '<script' in user_input:
raise ValueError("输入包含恶意脚本")
# 输出编码:将特殊字符转换为HTML实体
safe_comment = user_input.replace('<', '<').replace('>', '>')
response.send(safe_comment)
CSRF防护(令牌机制):
# 生成CSRF令牌,存储在session中
session['csrf_token'] = generate_token()
# 请求时检查令牌
def check_csrf(request):
token = request.headers.get('X-CSRF-Token') or request.get('csrf_token')
if token != session['csrf_token']:
raise CSRFError("令牌无效")
5) 【面试口播版答案】
面试官您好,针对SQL注入、XSS、CSRF的防护,以及360安全产品下的API设计,我的核心思路是采用多层次安全策略。首先,SQL注入通过参数化查询(预编译语句)解决,比如把用户输入作为参数传递,数据库解析时不会执行SQL,比如用?占位符,避免字符串拼接。然后XSS通过输入验证(检查输入是否包含脚本标签)和输出编码(将特殊字符转HTML实体,如<转<),比如用户评论输入先验证,再输出时编码。CSRF用CSRF令牌,每个请求附带唯一令牌,服务器验证令牌有效性,比如在敏感操作(如修改密码)的请求头或参数中检查令牌。结合360安全产品,比如动态防护技术,通过行为分析识别异常请求(如SQL注入的异常查询模式),实时拦截。设计API时,要明确输入参数的验证规则,输出数据的编码方式,敏感操作添加CSRF令牌,同时参考360的动态防护策略,结合用户行为分析,对异常请求动态调整防护强度,确保用户数据安全。
6) 【追问清单】
?,PostgreSQL用$1,SQL Server用@param),核心是将SQL和参数分离,避免拼接。<script等标签,或允许特定标签(如<b>)但转义其他。7) 【常见坑/雷区】
sql = "SELECT * FROM users WHERE id = " + user_id,导致SQL注入。<和>,忽略其他字符(如&,但&通常保留)。