You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

构建Python应用时,向外部AI API发送用户输入前如何防止敏感数据泄露?

针对你遇到的这个PII泄露风险问题,我整理了几个在Python里非常实用的解决方案,从快速落地到专业级处理都有,你可以根据自己的需求选择:

1. 正则表达式掩码(快速轻量方案)

你的思路其实没问题,正则确实能快速覆盖常见的PII格式,适合需求简单、场景固定的情况。关键是要把正则规则写得尽可能全面,比如覆盖不同地区的手机号、特殊格式的邮箱等。

举个实用的代码示例:

import re

def mask_common_pii(user_input):
    # 掩码邮箱:保留域名,替换@前内容为***
    masked = re.sub(r'([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', r'***@\2', user_input)
    # 掩码国内11位手机号:保留首尾各2位,中间用*******代替
    masked = re.sub(r'1[3-9]\d{9}', r'1*******\d{2}', masked)
    # 掩码18位身份证号:保留前6位和后4位,中间用********代替
    masked = re.sub(r'(\d{6})\d{8}(\d{3}[\dXx])', r'\1********\2', masked)
    
    return masked

# 测试一下
raw_input = "我的邮箱是alice.smith@company.com,手机号13987654321,身份证11010119950505123X"
print(mask_common_pii(raw_input))
# 输出:我的邮箱是***@company.com,手机号1*******21,身份证110101********123X

优缺点:优点是实现快、无额外依赖;缺点是容易漏掉小众格式的PII(比如国际手机号、不常见的邮箱后缀),需要持续维护规则。

2. 专用PII识别库(专业可靠方案)

如果你的场景需要处理多种类型的PII(比如姓名、地址、信用卡号等),或者对准确率要求高,那专门的PII处理库会更靠谱。首推微软的presidio-analyzerpresidio-anonymizer,它们是专门为PII识别和匿名化设计的,支持多语言和几十种实体类型。

步骤1:安装依赖

pip install presidio-analyzer presidio-anonymizer spacy
python -m spacy download zh_core_web_lg  # 下载spaCy的中文模型,支持多语言可按需替换

步骤2:代码实现

from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
from presidio_anonymizer.entities import OperatorConfig

def anonymize_pii(user_input):
    # 初始化分析器(识别PII)和匿名器(处理掩码)
    analyzer = AnalyzerEngine()
    anonymizer = AnonymizerEngine()
    
    # 识别文本中的PII实体(可指定要检测的类型,比如EMAIL_ADDRESS、PHONE_NUMBER、PERSON等)
    analysis_results = analyzer.analyze(
        text=user_input,
        entities=["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON", "CREDIT_CARD"],
        language="zh"
    )
    
    # 配置匿名化规则:比如用固定文本替换,或者自定义格式
    anonymize_operators = {
        "EMAIL_ADDRESS": OperatorConfig("replace", {"new_value": "[已掩码邮箱]"}),
        "PHONE_NUMBER": OperatorConfig("replace", {"new_value": "[已掩码手机号]"}),
        "PERSON": OperatorConfig("replace", {"new_value": "[姓名]"}),
        "CREDIT_CARD": OperatorConfig("mask", {"masking_char": "*", "chars_to_mask": 12, "from_end": True})
    }
    
    # 执行匿名化
    anonymized_result = anonymizer.anonymize(
        text=user_input,
        analyzer_results=analysis_results,
        operators=anonymize_operators
    )
    
    return anonymized_result.text

# 测试
raw_input = "你好,我叫张三,邮箱是zhangsan@test.com,手机号13512345678,信用卡号是4111-1111-1111-1111"
print(anonymize_pii(raw_input))
# 输出:你好,我叫[姓名],邮箱是[已掩码邮箱],手机号是[已掩码手机号],信用卡号是4111-****-****-1111

优缺点:优点是准确率高、支持多种PII类型、可扩展;缺点是有一定的学习成本,需要安装额外依赖。

另外,也可以用spaCy的NER(命名实体识别)模型来识别PII,但默认模型对PII的支持不如Presidio专门,适合已经在用spaCy的项目。

3. 数据最小化原则(从源头降低风险)

除了事后掩码,还可以从源头减少PII的传输:

  • 只传必要数据:如果是做文本摘要,能不能提取非敏感部分再发送?比如用户输入里的聊天内容,去掉其中的联系方式再调用API。
  • 用户提示:在输入框旁提示用户不要输入敏感信息,或者添加前置检查,提醒用户删除PII后再提交。
4. 额外安全补充
  • 确保和外部API的通信使用HTTPS(你的代码里已经做到了,这点很好)
  • 记录掩码操作的日志,便于后续审计和排查问题
  • 如果涉及合规要求(比如GDPR、CCPA),要确保你的处理方式符合相关法规

内容的提问来源于stack exchange,提问作者Rom Questa AI

火山引擎 最新活动