今日新建
2026-07-10 · 约8分钟阅读

AI助手接入API与安全防护技术要点

AI技术 API开发 安全防护 Flask

一、后端API代理服务器搭建

由于前端直接调用腾讯混元API会暴露密钥,需要搭建一个后端代理服务器。使用Flask框架快速实现。

🔧 技术栈

Flask + OpenAI Python客户端 + 腾讯混元API

🔑 密钥管理

通过环境变量读取API密钥,避免硬编码

🌐 端点设计

POST /chat 用于对话,GET /health 用于健康检查

🔄 请求转发

将前端请求转发到腾讯混元API,返回结果

核心代码实现

from flask import Flask, request, jsonify
from flask_cors import CORS
from openai import OpenAI
import os

app = Flask(__name__)
CORS(app)

client = OpenAI(
    api_key=os.getenv('OPENAI_API_KEY'),
    base_url="https://tokenhub.tencentmaas.com/v1"
)

@app.route('/health', methods=['GET'])
def health_check():
    return jsonify({"status": "ok"})

@app.route('/chat', methods=['POST'])
def chat():
    try:
        data = request.json
        messages = data.get('messages', [])
        
        response = client.chat.completions.create(
            model="hy3",
            messages=messages,
            temperature=0.7
        )
        
        return jsonify({
            "response": response.choices[0].message.content
        })
    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
✅ 关键配置:使用os.getenv('OPENAI_API_KEY')从环境变量读取密钥,确保密钥不会被提交到版本控制。base_url设置为腾讯Maas服务地址。

二、前端AI助手集成

前端需要实现对话界面、消息发送、回复接收和加载动画。

对话历史管理

class AIAssistant {
    constructor() {
        this.conversationHistory = [];
    }

    async sendMessage(message) {
        this.conversationHistory.push({
            role: 'user',
            content: message
        });

        const response = await fetch('/api/chat', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                messages: this.conversationHistory
            })
        });

        const data = await response.json();
        
        this.conversationHistory.push({
            role: 'assistant',
            content: data.response
        });

        return data.response;
    }
}

三级回答优先级逻辑

设计了一套智能回答机制,优先使用本地知识库,提升响应速度:

  1. 常用问题预设答案: 匹配到预设问题直接返回答案,无需调用API
  2. 关键词匹配本地知识库: 用户输入优先匹配本地关键词库,快速响应
  3. API调用: 未匹配到本地答案时,调用后端API获取AI回答
async getAnswer(userInput) {
    const presetQuestions = {
        "关于网站": "欢迎访问RongLong Tech技术博客...",
        "联系方式": "你可以通过邮件联系我..."
    };

    for (const [key, value] of Object.entries(presetQuestions)) {
        if (userInput.includes(key)) {
            return value;
        }
    }

    const localAnswers = this.matchKeywords(userInput);
    if (localAnswers) {
        return localAnswers;
    }

    return await this.callAPI(userInput);
}

三、安全防护措施

API服务上线前必须做好安全防护,防止恶意攻击和滥用。

后端安全

  1. 输入验证: 对用户输入进行严格验证,防止注入攻击
  2. 请求限流: 使用Flask-Limiter限制API调用频率
  3. 日志记录: 记录所有请求,便于排查问题
  4. 错误处理: 返回友好的错误信息,不暴露系统细节
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

limiter = Limiter(
    get_remote_address,
    app=app,
    default_limits=["100 per minute", "1000 per hour"]
)

@app.route('/chat', methods=['POST'])
@limiter.limit("50 per minute")
def chat():
    data = request.json
    if not data or 'messages' not in data:
        return jsonify({"error": "Invalid request"}), 400
    
    messages = data['messages']
    if not isinstance(messages, list):
        return jsonify({"error": "Messages must be a list"}), 400
    
    for msg in messages:
        if 'role' not in msg or 'content' not in msg:
            return jsonify({"error": "Invalid message format"}), 400

前端安全

  1. XSS防护: 使用DOMPurify清理用户输入和AI返回内容
  2. CSP配置: 设置Content Security Policy限制资源加载
  3. 请求加密: 通过HTTPS传输,防止中间人攻击
import DOMPurify from 'dompurify';

function renderMessage(content) {
    const cleanContent = DOMPurify.sanitize(content);
    const messageElement = document.createElement('div');
    messageElement.innerHTML = cleanContent;
    return messageElement;
}

Cloudflare Edge安全

项目通过Cloudflare部署,可利用Cloudflare的安全功能:

  1. WAF规则: 配置Web Application Firewall阻止常见攻击
  2. 速率限制: 在Edge层设置请求速率限制
  3. Bot管理: 使用Cloudflare Bot Management识别和阻止恶意爬虫
⚠️ 安全提醒: 如果API密钥曾经提交到git历史中,必须立即轮换!即使删除了包含密钥的文件,git历史中仍然存在。使用git filter-branchgit rm --cached清除历史中的敏感信息。

四、API密钥同步更新

在腾讯平台更换API密钥后,需要同步更新到Web程序中:

更新方法

  1. 更新环境变量: 在部署平台(如Cloudflare Pages、Vercel、服务器)中更新环境变量
  2. 重启服务: 确保新的环境变量生效
  3. 验证: 发送测试请求确认新密钥正常工作

验证步骤

# 1. 检查环境变量是否正确设置
echo $OPENAI_API_KEY

# 2. 发送测试请求
curl -X POST http://localhost:5000/chat \
  -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"你好"}]}'

# 3. 检查返回结果是否包含正常响应
✅ 更新注意事项:
  • 更换密钥后,旧密钥立即失效,需要确保所有使用该密钥的服务都已更新
  • 建议使用密钥轮换策略,定期更换API密钥
  • 不要在代码中硬编码密钥,始终使用环境变量
  • 在生产环境中,使用密钥管理服务(如AWS Secrets Manager、HashiCorp Vault)管理密钥

遇到的问题汇总

问题原因解决
前端直接调用API暴露密钥浏览器端无法隐藏API密钥搭建后端代理服务器,前端只调用代理接口
API调用无响应网络问题或密钥错误检查环境变量、网络连接和API端点
对话历史丢失前端未正确维护conversationHistory每次请求都包含完整的对话历史
API被恶意调用缺乏限流和验证机制添加请求限流和输入验证
🤖
AI助手
ONLINE