news 2026/7/19 4:06:04

从脚本到应用:给 Web 加个安全的问答接口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从脚本到应用:给 Web 加个安全的问答接口

正要交付给业务方使用时,我们还需要一个 Web 接口,并加上安全认证。这正是 Vanna 中文文档里 web-app-auth 示例所着重强调的。

下面是一个用 Flask 搭建的最小安全接口思路(简化版):

from flask import Flask, request, jsonify
import vanna as vn

app = Flask(name)
vn.set_api_key(‘your-api-key’)
vn.connect_to_sqlite(‘prod.db’)
vn.train(…) # 已训练

简单的 token 认证装饰器

def require_auth(f):
def decorated(*args, **kwargs):
token = request.headers.get(‘Authorization’)
if token != ‘Bearer my-secret-token’:
return jsonify({“error”: “Unauthorized”}), 401
return f(*args, **kwargs)
return decorated

@app.route(‘/ask’, methods=[‘POST’])
@require_auth
def ask():
question = request.json.get(‘question’)
# allow_llm_to_see_data=False 可以先只生成SQL,由你审核后再执行
sql = vn.generate_sql(question)
# 在这里可以加入权限校验:如表白名单、Limit 强制添加等
if not sql.lower().startswith(‘select’):
return jsonify({“error”: “Only SELECT allowed”}), 403
df = vn.run_sql(sql)
return jsonify({“sql”: sql, “data”: df.to_dict()})
几个关键的安全实践:

只给数据库只读账户:Vanna 连接的数据库账号永远不要给 DROP、DELETE 权限。

SQL 白名单校验:在 run_sql 前用正则确保只执行 SELECT 语句,并强制加上 LIMIT 1000。

按用户注入行级过滤:在生成 SQL 后,自动拼接 WHERE tenant_id = ‘当前用户所属租户’,实现数据隔离。

这些手段,在 Vanna 的文档中都有详尽的最佳实践,确保你能把 AI 的能力安全地封装成产品功能,而不是制造一个 SQL 注入的后门。

凭什么不自己从零撸?
你可能会说:“我用 LangChain 的 SQL Agent,或者直接拼 Prompt 调 GPT-4o,也能跑起来呀。” 确实,但 LangChain 的 Agent 更加通用且重,面向 SQL 场景时往往需要你写大量脚手架代码去管理 Schema 上下文、历史缓存、连接池等。而 Vanna 专注一件事:成为连接数据库和 LLM 最高效的那根管道。它用简短的代码量,提供了开箱即用的训练机制、向量记忆和结果缓存,让你能把精力放在理解业务问题本身。

写在最后
Vanna 正在让"自然语言查数据"从一个需要整个团队啃半年的项目,变成一名后端工程师一个下午就能集成完的特性。它把最复杂的语义理解、SQL 生成、上下文检索打包成了一个优雅的 Python 库,同时又把模型和存储的掌控权完整地交到了你手上。

下次产品经理再拍出那个"搜索框"需求时,你可以云淡风轻地回一句:“好啊,下班前给你 demo。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 4:04:27

《2001:太空漫游》(2001: A Space Odyssey)中的黑曜石状长方体,其实不是普通意义上的“外星设备”,它更像一个关于人类进化、意识、技术和宇宙意义的哲学符号

《2001:太空漫游》(2001: A Space Odyssey)中的黑曜石状长方体,其实不是普通意义上的“外星设备”,它更像一个关于人类进化、意识、技术和宇宙意义的哲学符号。导演Stanley Kubrick故意没有给出唯一答案,让…

作者头像 李华
网站建设 2026/7/19 4:03:11

ChatGPT语音交互技术解析:从原理到开发实践

最近OpenAI CEO Sam Altman公开表示,ChatGPT的语音交互体验已经超越了传统的打字交流方式。这一表态引发了广泛关注,特别是对于日常使用AI助手的开发者和技术爱好者来说,语音交互的成熟度直接关系到工作效率和用户体验的提升。 从技术角度看…

作者头像 李华
网站建设 2026/7/19 4:02:35

C++延时队列实现:从优先队列到订单超时实战

1. 项目概述:为什么需要自己动手写一个延时队列?在C后端开发里,处理定时任务是个绕不开的坎。你可能遇到过这些场景:电商订单超过30分钟未支付自动取消、用户登录的验证码5分钟后失效、游戏里的技能冷却倒计时、或者消息推送的延迟…

作者头像 李华
网站建设 2026/7/19 4:01:52

ARMv8-A调试架构与AM62L处理器外部调试寄存器深度解析

1. 项目概述:ARMv8-A调试架构与AM62L处理器在嵌入式系统开发,尤其是基于ARM架构的复杂SoC设计中,调试能力的好坏直接决定了项目的成败周期。想象一下,你面对的是一个集成了多个Cortex-A核心、实时协处理器和复杂外设的片上系统&am…

作者头像 李华
网站建设 2026/7/19 4:01:12

PhoneBindPage:更换手机号表单设计与验证

前言 “海风日记“的手机绑定页面支持更换手机号,包含当前绑定信息展示和新手机号表单。 本文将从 PhoneBindPage.ets 源码出发,深入讲解手机绑定页的实现。 一、页面布局 Column({ space: 20 }) {// 当前绑定信息Column({ space: 8 }) {Text(当前绑定…

作者头像 李华
网站建设 2026/7/19 4:00:48

单位时间内,你进行了多少次有效尝试。

一个人的成长速度,很大程度取决于他在现实中获得了多少次有效反馈。很多人以为: 人与人之间的差距来自: 天赋。 智力。 运气。但还有一个经常被忽视的变量:迭代次数。也就是: 你在同样时间里, 尝试了多少次…

作者头像 李华