【问题标题】:PHP strip tags are not workingPHP条标签不起作用
【发布时间】:2015-07-25 17:58:34
【问题描述】:

我试图从我创建的 php 论坛中删除 xss 脚本。为此,我尝试了 strip_tags 功能。但是,当我尝试它时。标签仍然被张贴并且 xss 脚本未修复。这是我试过的代码。它出什么问题了?

    // get data that sent from form 
$topic=$_POST['topic'];
$detail=$_POST['detail'];
$name=$_POST['name'];
$email=$_POST['email'];

$topic = strip_tags($topic);
$detail = strip_tags($detail);
$name = strip_tags($name);
$email = strip_tags($email);

$datetime=date("d/m/y h:i:s"); //create date time

$sql="INSERT INTO $tbl_name(topic, detail, name, email, datetime)VALUES('$topic', '$detail', '$name', '$email', '$datetime')";

$stmt = $dbh->prepare($sql);
$stmt->execute();

【问题讨论】:

  • xss ?更像是sql注入。
  • 没有它的 xss。我输入了 并且分页做了警报
  • 输出的内容是script标签吗? @frz3993 还指出您对使用此代码的 SQL 注入持开放态度。不要将用户输入直接传递给您的查询。 stackoverflow.com/questions/60174/… 使用 strip_tags,您的内容将是 alert(5);
  • 您的代码存在一些问题,如果您还没有看到,我已经在下面的回答中概述了这些问题。在这里来回评论我,会占用太多空间。
  • 看来我们在这里停滞不前,祝你好运。

标签: php mysql html tags xss


【解决方案1】:

编辑:似乎我没有抓住问题,我的错误。

在您的 HTML 表单中使用htmlspecialchars(),而不是在查询和准备语句期间/之前使用strip_tags();请参阅我的原始答案以获取底部附近的相关链接。

旁注:$stmt = $dbh->prepare($sql); 带有“准备”一词,不符合准备好的声明。您需要使用完整且正确的语法。

即:

<input name="var" value="<?php echo htmlspecialchars($var)?>">

您还可以阅读一些关于该主题的文章:


原答案:

这里发生了一些问题。

首先,datetimename 是 MySQL 的保留字,您没有对它们进行特殊处理。

将这些列名包装在刻度中

(topic, detail, `name`, email, `datetime`)

检查错误会发出语法错误的信号。

不清楚您使用哪个 MySQL API 进行连接,因此请使用适当的错误连接方法。

还不清楚$tbl_name 的定义是什么。

如果该表名包含空格、连字符或任何 MySQL 会抱怨的内容,则将该变量也包含在记号中。

即:

INSERT INTO `$tbl_name` (topic, detail, `name`, email, `datetime`)

如果您的日期列是 DATETIME,那么 MySQL 会将这些存储为 YYYY-MM-DD HH:MM:SS,因此 date("d/m/y h:i:s") 将失败。

参考:https://dev.mysql.com/doc/refman/5.0/en/datetime.html

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存阶段显示错误,而不是在生产阶段。


使用准备好的语句

通过咨询帮助预防注射:

旁注:strip_tags() 没有做任何事情来帮助防止 SQL 注入。

还要确保您的表单确实使用了 POST 方法,并且您的输入带有它们的名称属性而不是拼写错误。

【讨论】:

  • 好吧,我会再看一看。感谢您提供所有信息
  • 先生一如既往的好回答
【解决方案2】:

您应该以这种方式防止 sql 注入:

替换

        $topic = strip_tags($topic);
        $detail = strip_tags($detail);
        $name = strip_tags($name);
        $email = strip_tags($email);

        $datetime=date("d/m/y h:i:s"); //create date time

        $sql="INSERT INTO $tbl_name(topic, detail, name, email, datetime)VALUES('$topic', '$detail', '$name', '$email', '$datetime')";
    $stmt = $dbh->prepare($sql);
$stmt->execute();

        $datetime=date("d/m/y h:i:s"); //create date time

        $sql="INSERT INTO $tbl_name(`topic`, `detail`, `name`, `email`, `datetime`)VALUES(?, ?, ?, ?, ?)";
    $stmt = $dbh->prepare($sql);
$stmt->execute([$topic, $detail, $name, $email, $datetime]);

关于xss-prevention,您应该在将文本字段输出到浏览器时使用htmlspecialchars,例如:

不是echo $topic;,而是echo htmlspecialchars($topic);

【讨论】:

  • 所以你添加了我看到的刻度,在 ;-)
  • $topic = htmlspecialchars($topic); $detail = htmlspecialchars($detail); $name = htmlspecialchars($name); $email = htmlspecialchars($email);没用
  • 你可以这样做。是的。但我不推荐你。最好存储在数据库中“清除用户输入”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
相关资源
最近更新 更多