如何阻止用户在描述字段输入脚本/SQL代码?现有正则方案存缺陷
当前正则校验方案的合理性分析
你的现有正则方案只能覆盖部分简单的恶意输入场景,无法做到100%拦截,核心问题包括:
- 覆盖范围太窄:JS仅检测了
alert/confirm/prompt三个函数,像eval、setTimeout、document.write这类危险操作完全没覆盖;SQL只匹配了6个关键词,drop、alter、like等高危操作都没纳入;jQuery的正则只识别$()写法,jQuery()这种标准调用会直接绕过。 - 抗绕过能力弱:攻击者可以通过字符拆分(比如
a\lert(1))、插入注释(alert/*xxx*/(1);)、大小写混合(Alert(1))、空格拆分关键词(se lect * from)等方式轻松绕过正则匹配。 - 逻辑小瑕疵:循环中
break后,$description只会保留最后一次循环的匹配描述,而非实际触发检测的那个规则的描述,会导致错误提示不准确。
基于正则的优化方向
如果想继续用正则强化校验,可以做以下调整:
- 扩展危险特征库:
- JS函数:加入
eval、setTimeout、setInterval、document\.write、document\.cookie、window\.location等; - SQL关键词:补充
drop、create、alter、truncate、like、join等; - jQuery规则:修改为
/(?:\$|jQuery)\([^)]*\)\.?[a-z]+/i,覆盖两种调用写法。
- JS函数:加入
- 增强抗绕过能力:在关键词的字符间加入
\W*(匹配任意非单词字符),比如把alert的规则改成/\ba\W*l\W*e\W*r\W*t\b\s*\([^;]*\)\s*;/i,应对拆分、注释类的绕过(注意:这种写法可能增加误判概率,需要结合业务场景调整)。
更可靠的第三方校验方案
如果追求更高的安全性和稳定性,推荐使用成熟的安全库:
- HTMLPurifier:专注于HTML内容过滤和XSS防护,能自动识别并移除脚本标签、事件属性(如
onclick)、嵌入的JS代码,同时可以保留合法的HTML格式,非常适合产品描述这类可能包含富文本的场景。 - OWASP ESAPI for PHP:OWASP官方推出的安全工具集,包含输入验证、输出编码、恶意内容检测等全套安全能力,能有效拦截SQL注入、XSS等常见攻击,提供标准化的安全校验逻辑。
- PHP内置Filter扩展:可以配合使用
FILTER_SANITIZE_STRING等过滤器快速移除危险字符,虽然功能不如专门的安全库全面,但作为基础校验层能起到辅助作用。
内容的提问来源于stack exchange,提问作者Punit Gajjar
相关产品推荐
相关产品推荐

