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)?>">
您还可以阅读一些关于该主题的文章:
- XSS Cross Site Scripting Prevention Cheat Sheet
- https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet
原回答:
这里出现了一些问题。
首先,datetime
和 name
是 MySQL 保留字,您没有给予它们特殊待遇。
用刻度线包裹这些列名
(topic, detail, `name`, email, `datetime`)
检查错误会指示语法错误。
- MySQLi 错误检查:http://php.net/manual/en/mysqli.error.php
- PDO 错误检查:http://php.net/manual/en/pdo.error-handling.php
不清楚您正在使用哪个 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
旁注:显示错误只应在试运行中进行,绝不能在生产中进行。
使用准备好的语句
通过咨询帮助预防注射:
How can I prevent SQL-injection in PHP? 在堆栈上。
使用prepared statements, or PDO with prepared statements,它们更安全。
旁注: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);
我正试图从我创建的 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)?>">
您还可以阅读一些关于该主题的文章:
- XSS Cross Site Scripting Prevention Cheat Sheet
- https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet
原回答:
这里出现了一些问题。
首先,datetime
和 name
是 MySQL 保留字,您没有给予它们特殊待遇。
用刻度线包裹这些列名
(topic, detail, `name`, email, `datetime`)
检查错误会指示语法错误。
- MySQLi 错误检查:http://php.net/manual/en/mysqli.error.php
- PDO 错误检查:http://php.net/manual/en/pdo.error-handling.php
不清楚您正在使用哪个 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
旁注:显示错误只应在试运行中进行,绝不能在生产中进行。
使用准备好的语句
通过咨询帮助预防注射:
How can I prevent SQL-injection in PHP? 在堆栈上。
使用prepared statements, or PDO with prepared statements,它们更安全。
旁注: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);