电商API安全防护:JWT令牌与XSS防御实战

news/2025/2/22 15:18:33

在电商 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)  # 输出: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
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 的安全性,保护用户数据和系统免受攻击。


http://www.niftyadmin.cn/n/5862440.html

相关文章

flowable适配达梦数据库

文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错&#xff1a;inStream参数为null分析解决 liquibase相关问题问题一&#xff1a;不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…

网络安全-Mysql注入知识点

本篇文章介绍sql注入时数据库是Mysql时需要掌握的知识点。以Navicat、mysql 5.7.4为例。 注释 #或--空格是单行注释 /**/是内联注释 SQL语句 查询语句 SELECT〈目标列组〉 FROM〈数据源〉 [WHERE〈元组选择条件〉] [GROUP BY〈分列组〉[HAVING 〈组选择条件…

MySql面试宝典【刷题系列】

文章目录 一、Mysql 的存储引擎 myisam 和 innodb 的区别。二、MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;三、对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题&#xff1f;四、锁的优化策略…

代码随想录算法训练day59---图论系列4

代码随想录算法训练 —day59 文章目录 代码随想录算法训练前言一、110.字符串接龙二、105.有向图的完全可达性dfs版本1dfs版本2bfs版本 三、100. 岛屿的最大面积方法一方法二 总结 前言 今天是算法营的第59天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&…

工控自动化领域:数字量信号与模拟量信号的差异解析

在工控自动化的神秘世界里&#xff0c;信号如同传递指令和信息的使者&#xff0c;而数字量信号和模拟量信号则是其中的两大主角。它们各自有着独特的 “性格” 和 “使命”&#xff0c;在不同的场景中发挥着关键作用。下面&#xff0c;就让我们一起来深入了解一下它们的区别。 …

x安全服务 y安全体系 z网络安全模型 网络安全体系设计

这一年来&#xff0c;网络安全行业兴奋异常。各种会议、攻防大赛、黑客秀&#xff0c;马不停蹄。随着物联网大潮的到来&#xff0c;在这个到处都是安全漏洞的世界&#xff0c;似乎黑客才是安全行业的主宰。然而&#xff0c;我们看到的永远都是自己的世界&#xff0c;正如医生看…

关于css中bfc的理解

首先需要了解的是bfc的缩写是block formatting context 块级格式化上下文 那么块级格式化上下文意味着我们在bfc的区域内生成了一块独立于当前文本流的样式、它不受外界样式的影响、有着专属于自己的样式。 基于这样的定义我们可以避免一些样式冲突、在我们开发者面对复杂布局…

今天踩个大坑,jdk1.8版本对应可使用的gradle

这俩版本都是基于jdk1.8版本的as可以使用的gradle版本