You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django文本输入危险字符筛查方案咨询

针对Django表单注入攻击防护的问题解答

1. 还需拦截哪些危险字符?

除了你提到的尖括号<>、大括号{}、正反斜杠\ /,以下字符也需要纳入拦截范围:

  • 单引号'、双引号"、反引号`:这类字符可用于构造HTML属性注入,若涉及原生SQL场景(尽管Django ORM默认防SQL注入),也可能被利用拼接恶意语句
  • 分号;、与号&、等号=:常被用于拼接恶意脚本片段或构造URL参数注入
  • 加号+、百分号%:可能通过URL编码绕过基础筛查,传递恶意内容

注意:若采用白名单策略,无需逐一枚举危险字符,只需定义允许的字符集即可覆盖所有风险

2. 白名单方式是否更优?

是的,白名单策略远优于黑名单。
黑名单的缺陷在于永远无法覆盖所有潜在危险字符(比如新的攻击手法可能使用未被收录的字符组合),而白名单仅放行明确安全的字符(比如你的场景里的字母、数字、连字符、括号),从根源上切断了恶意注入的可能。同时白名单规则更简洁易维护,只需根据业务需求定义一次即可,无需频繁更新黑名单列表。

3. 自定义逐字段筛查是否合理?有没有可复用的库?

  • 逐字段筛查完全合理:不同字段的业务需求不同(比如部分字段允许括号,另一部分可能不需要),针对每个字段定制筛查规则,既能满足业务灵活性,又能保证安全粒度。
  • 无需额外第三方库,Django内置工具即可满足需求:
    Django的RegexValidator可以直接在表单字段中配置白名单正则,快速实现字符筛查,示例代码如下:
    from django import forms
    from django.core.validators import RegexValidator
    
    class YourForm(forms.Form):
        short_text = forms.CharField(
            max_length=50,
            validators=[
                RegexValidator(
                    regex=r'^[a-zA-Z0-9\-()]+$',
                    message='仅允许字母、数字、连字符和括号',
                    code='invalid_input'
                )
            ]
        )
        long_text = forms.CharField(
            max_length=250,
            validators=[RegexValidator(r'^[a-zA-Z0-9\-()]+$')]
        )
    
    若需要更复杂的逻辑,也可以重写字段的clean_<field_name>方法实现自定义筛查。

另外补充一点:输入筛查是防护的一环,输出时也要依赖Django模板的自动转义(默认开启),避免存储的内容在前端渲染时触发XSS,形成完整的防护链条。

内容的提问来源于stack exchange,提问作者JDM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:42:43