如何避免MariaDB取出的带引号内容显示时附带反斜杠转义符?
问题根源
你遇到的是双重转义问题:
你同时使用了mysqli_real_escape_string()手动转义和预处理语句参数绑定,而后者本身就已经自带了SQL注入防护的转义逻辑,两次转义就会把额外的反斜杠存进数据库。
另外你把htmlentities()的调用放在了存库阶段也是不合理的,这个函数是用来做前端XSS防护的,应该放在输出环节调用,存原始内容到数据库更方便后续其他场景复用数据。
修复方案
1. 调整存库逻辑
删掉手动转义步骤,直接把原始用户输入绑定到预处理参数即可:
// $con为数据库连接 <?php $message = $_POST['message']; $insert = $con->prepare("INSERT INTO `db` (message) values(?)"); $insert->bind_param("s", $message); $insert->execute();
2. 调整输出逻辑
从数据库读取内容后,输出到页面前再调用htmlentities()处理,既能防XSS攻击,也不会出现多余的转义符:
// $db_msg为从数据库取出的原始内容 echo htmlentities($db_msg);
旧数据处理
如果你的数据库里已经有带多余反斜杠的旧数据,可以用stripslashes()函数批量清理旧数据,应急场景下也可以在输出的时候临时调用stripslashes()处理内容,不过还是建议优先修正存库逻辑从根源解决问题。
内容的提问来源于stack exchange,提问作者rockoversweden
相关产品推荐
相关产品推荐

