PHP strip标签不起作用

时间:2015-07-25 17:58:34

标签: php mysql html5 tags xss

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

2 个答案:

答案 0 :(得分:3)

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

在查询和预处理语句期间/之前,使用htmlspecialchars()表示HTML表单中的输入,而不是strip_tags();请参阅底部附近相关链接的原始答案。

旁注:用{&#34;准备&#34;来$stmt = $dbh->prepare($sql);<input name="var" value="<?php echo htmlspecialchars($var)?>"> ,没有资格作为准备好的陈述。您需要使用完整而正确的语法。

即:

datetime

还有一些文章可以阅读这个主题:

原始答案:

这里发生了一些问题。

首先,name(topic, detail, `name`, email, `datetime`) 是MySQL保留字,您不会给予特殊处理。

用刻度线

包装这些列名
$tbl_name

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

目前还不清楚您使用哪种MySQL API进行连接,因此请使用相应的错误连接方法。

还不清楚INSERT INTO `$tbl_name` (topic, detail, `name`, email, `datetime`) 被定义为什么。

如果该表名包含空格或连字符,或者MySQL会抱怨的任何内容,那么也将该变量包装在刻度中。

即:

DATETIME

如果您的日期列是date("d/m/y h:i:s"),那么MySQL会将这些列存储为YYYY-MM-DD HH:MM:SS,因此<?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of your code 将失败。

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

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

{{1}}

旁注:只应在暂存时进行显示错误,而不是生产。

使用预先准备好的陈述

通过咨询帮助预防注射:

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

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

答案 1 :(得分:0)

你应该以这种方式阻止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你在输出文本字段TO BROWSER时应该使用htmlspecialchars,类似于:

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