PHP 条带标签不起作用

PHP strip tags are not working

我正试图从我创建的 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();

编辑:看来我没抓住问题,我的错误。

在 HTML 表单中使用 htmlspecialchars() 作为输入,而不是 strip_tags() during/before 查询和准备语句;请参阅底部附近相关链接的原始答案。

旁注:用单词 "prepare" 做 $stmt = $dbh->prepare($sql); 不符合准备好的语句。您需要使用完整且正确的语法。

即:

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

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


原回答:

这里出现了一些问题。

首先,datetimename 是 MySQL 保留字,您没有给予它们特殊待遇。

用刻度线包裹这些列名

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

检查错误会指示语法错误。

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

还不清楚 $tbl_name 的定义。

如果 table 名称包含空格、连字符或任何 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 方法,并且您的输入具有它们的名称属性,而不是拼写错误。

您应该以这种方式防止 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 预防,当将文本字段输出到浏览器时,您应该使用 htmlspecialchars,例如:

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