【问题标题】:remove post html, js, css on insert into mysql在插入 mysql 时删除 post html、js、css
【发布时间】:2018-09-07 07:31:49
【问题描述】:

当我在文本输入中发布htmljscss 标记、规则、语法时。它显示在页面结果中!
我使用 $conn->real_escape_stringmysqli 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 阅读了过去的细节。 “过滤输入/转义输出”是一个通用概念,与任何特定技术无关。

标签: php mysql


【解决方案1】:

这是一个 XSS 问题,而不是数据库或 CSS 问题。

快速回答是您必须对您在 HTML 上下文中显示的任何用户数据调用 htmlspecialchars。这将抵消用户有意或无意引入的任何 HTML。

长答案是人们喜欢能够输入一些格式,因此请考虑使用类似Markdown 这样的内容,这样您就可以输入类似*bold*_italic_ 的内容,而不必编写实际的HTML。有许多现成的 PHP 实现。

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 2019-05-09
    • 2021-10-14
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多