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

PHP防SQL注入字符串清理函数单引号未替换、转义乱码问题求助

问题原因与解决方案

核心错误:自定义字符过滤不适合防范SQL注入

首先明确:依靠自行编写的字符串替换函数防范SQL注入是错误且不安全的方案,存在大量绕过风险,同时会破坏原有业务数据。正确做法是直接使用PDO或mysqli的预处理语句(参数化查询),从底层完全规避SQL注入风险,不需要自行处理任何特殊字符。

具体问题原因

1. 单引号未被替换的问题

你第一版代码的替换逻辑本身无效:

  • 单引号对应的替换值\x27是单引号本身的十六进制表示,相当于把单引号替换为单引号,自然看不到变化
  • 代码存在语法错误:$array_replace数组定义行末尾缺少分号
  • 逗号对应的替换值\x82是ASCII扩展控制字符,不属于UTF-8合法可见字符,直接输出到网页必然产生乱码

2. HTML实体输出乱码的问题

你使用&#40这类HTML实体编码时存在多处错误:

  • 标准HTML实体必须以分号结尾,正确写法是(,缺少分号会导致浏览器将实体编码和后续字符合并解析为错误的Unicode字符,就是你看到的&ු这类乱码
  • 你后续调整的替换数组中&(属于非法HTML实体格式,同样会被浏览器解析为错误字符,产生乱码
  • 随意调用utf8_encode():该函数作用是将ISO-8859-1编码的字符串转为UTF-8,如果你的输入本身已经是UTF-8编码,调用该函数会导致字符重复编码,进一步产生乱码。该函数在PHP 8.2及以上版本已经被废弃,如需处理编码请使用mb_convert_encoding()明确指定输入输出编码

3. 法语重音字符替换的问题

你自行替换重音字符的逻辑完全多余,PHP原生的htmlentities()可以直接处理所有需要转义的HTML特殊字符,不需要自行维护映射数组。

正确的业务处理逻辑

  • 如果是需要对输出到网页的内容做XSS防护,直接使用htmlspecialchars($str, ENT_QUOTES, 'UTF-8')即可,不需要自行编写替换逻辑
  • 如果是防范SQL注入,完全不需要对输入内容做任何修改,直接使用预处理语句绑定参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 01:54:01