在电商 API 的安全防护中,JWT(JSON Web Token)令牌用于身份验证和授权,而 XSS(跨站脚本攻击)防御则是防止恶意脚本注入,保护用户数据和系统安全。以下是这两方面的实战介绍。
JWT 令牌实战
1. 生成 JWT 令牌
首先,你需要安装 PyJWT
库(假设使用 Python):
pip install PyJWT
以下是生成 JWT 令牌的示例代码:
import jwt
import datetime
# 密钥,用于签名 JWT
SECRET_KEY = "your_secret_key"
def generate_token(user_id):
# 设置令牌的过期时间
expiration = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
# 构建负载信息
payload = {
"user_id": user_id,
"exp": expiration
}
# 生成 JWT 令牌
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
return token
# 示例使用
user_id = 123
token = generate_token(user_id)
print(token)
2. 验证 JWT 令牌
在 API 端,需要对传入的 JWT 令牌进行验证:
def verify_token(token):
try:
# 验证并解码 JWT 令牌
decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return decoded
except jwt.ExpiredSignatureError:
print("Token has expired")
return None
except jwt.InvalidTokenError:
print("Invalid token")
return None
# 示例使用
decoded = verify_token(token)
if decoded:
print("Token is valid. User ID:", decoded["user_id"])
3. 在 API 中集成 JWT 验证
在 Flask 框架中集成 JWT 验证的示例:
from flask import Flask, request, jsonify
import jwt
app = Flask(__name__)
SECRET_KEY = "your_secret_key"
def verify_token(token):
try:
decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return decoded
except jwt.ExpiredSignatureError:
return None
except jwt.InvalidTokenError:
return None
@app.route('/protected', methods=['GET'])
def protected_route():
token = request.headers.get('Authorization')
if not token:
return jsonify({"message": "Token is missing"}), 401
token = token.replace('Bearer ', '')
decoded = verify_token(token)
if not decoded:
return jsonify({"message": "Invalid token"}), 401
return jsonify({"message": "This is a protected route", "user_id": decoded["user_id"]})
if __name__ == '__main__':
app.run(debug=True)
XSS 防御实战
1. 输入验证和过滤
在接收用户输入时,对输入进行验证和过滤,只允许合法的字符和格式。例如,在 Python 的 Flask 框架中:
from flask import Flask, request, jsonify
import re
app = Flask(__name__)
def validate_input(input_str):
# 只允许字母、数字和常见标点符号
pattern = re.compile(r'^[a-zA-Z0-9.,!?\s]+$')
return bool(pattern.match(input_str))
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('query')
if not validate_input(query):
return jsonify({"message": "Invalid input"}), 400
# 处理搜索逻辑
return jsonify({"message": "Search results", "query": query})
if __name__ == '__main__':
app.run(debug=True)
2. 输出编码
在将用户输入的数据返回给前端时,对数据进行编码,将特殊字符转换为 HTML 实体。在 Python 中,可以使用 html.escape
函数:
import html
user_input = '<script>alert("XSS")</script>'
encoded_input = html.escape(user_input)
print(encoded_input) # 输出: <script>alert("XSS")</script>
3. 设置 CSP(内容安全策略)
CSP 可以限制页面可以加载的资源来源,防止恶意脚本的注入。在 Flask 中,可以通过设置响应头来实现:
from flask import Flask
app = Flask(__name__)
@app.after_request
def add_csp_header(response):
response.headers['Content-Security-Policy'] = "default-src'self'"
return response
@app.route('/')
def index():
return "This is the home page"
if __name__ == '__main__':
app.run(debug=True)
通过以上 JWT 令牌和 XSS 防御的实战措施,可以有效提高电商 API 的安全性,保护用户数据和系统免受攻击。