我试图从我的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();
答案 0 :(得分:3)
编辑:我似乎没有抓住这个问题,我的错误。
在查询和预处理语句期间/之前,使用htmlspecialchars()
表示HTML表单中的输入,而不是strip_tags()
;请参阅底部附近相关链接的原始答案。
旁注:用{"准备"来$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);