使用base64编码处理入库数据是否能够防范SQL注入攻击?
结论
你给出的这段通过base64编码后拼接SQL的代码,确实可以避免SQL注入漏洞,但这是非常不推荐的防护方案,存在诸多严重的弊端。
该方案的核心问题
- 无意义的资源开销:base64编码会让原始数据的体积增加1/3,既浪费数据库存储空间,又增加了写入时编码、读取时解码的额外性能消耗,数据量越大浪费越明显。
- 彻底丢失数据库文本处理能力:编码后的数据无法直接使用SQL进行模糊查询、排序、筛选、字符串计算等操作,后续业务需要操作这些内容时,只能全量取出数据解码后再处理,会带来极高的额外开发成本和性能损耗。
- 防护能力不通用:该方案只能应对字符串类型参数拼接的场景,如果业务涉及动态拼接数值参数、表名、字段名、排序规则等场景,base64编码完全起不到防护作用,无法作为通用的防注入方案使用。
正确的SQL注入防护方案
PHP+MySQLi环境下首选预处理语句(参数化查询),这是业界公认的最安全、最通用的防注入方案,你的需求可以改成如下写法,不需要额外编码解码即可实现安全写入:
$data = $_POST['input']; // 声明带占位符的预处理SQL $stmt = mysqli_prepare($conn, "INSERT INTO table(`string`) VALUES (?)"); // 绑定参数,s标识参数为字符串类型 mysqli_stmt_bind_param($stmt, "s", $data); // 执行查询 mysqli_stmt_execute($stmt);
如果业务确实存在需要动态拼接表名、字段名等不能用参数占位的场景,建议使用白名单校验用户输入,仅允许预设的合法值传入拼接。
内容的提问来源于stack exchange,提问作者Mark Shaposhnik
相关产品推荐
相关产品推荐

