【发布时间】:2018-09-07 07:31:49
【问题描述】:
当我在文本输入中发布html、js、css 标记、规则、语法时。它显示在页面结果中!
我使用 $conn->real_escape_string 和 mysqli prepared statement 但对我来说仍然不安全。
我的代码是:
<?php
require 'config/config.php';
mysqli_set_charset($conn,"utf8");
$qmsg = $_POST["qsmsg"];
$qmsgs = mysqli_real_escape_string($conn, $qmsg);
$ansr = "Answer";
$userName = "John";
$userId="4";
$userType="user";
$imgsp="images/avatar.jpg";
$stmt = $conn->prepare("INSERT INTO qa (qus, ansrq, uname, uid, utype, uimage) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("sssiss", $qmsgs, $ansr, $userName, $userId, $userType, $imgsp);
...
$stmt->close();
$conn->close();
?>
【问题讨论】:
-
您正在使用占位符值,这很好,但您也在转义,这是一个错误:这会双重转义并损坏数据。仅使用占位符值和
bind_param。 -
删除带有
mysqli_real_escape_string的行,它不属于它,它会破坏你的数据。 -
这只是创建了一个变量,它是另一个变量的副本,所以这是多余的。只需将
$qmsg传递到bind_param即可。 -
不要预先转义,您不知道这些数据最终会在哪里结束。如果您更新您的应用程序以通过 JSON 发送它会怎样?然后您需要对其进行转义,然后将其重新转义为 JSON。太乱了一般规则:仅在显示时转义它,而不是保存它。
-
@SchoolforDesign 阅读了过去的细节。 “过滤输入/转义输出”是一个通用概念,与任何特定技术无关。