gpt4 book ai didi

php - 使用已使用 filter_input() 过滤的 htmlspecialchars() 从数据库输出数据

转载 作者:行者123 更新时间:2023-12-03 23:32:18 24 4
gpt4 key购买 nike

我从不同的博客中发现,强烈建议使用 htmlspecialchars() 在屏幕上输出任何数据,以免受 XSS 攻击

我正在使用 filter_input() 在插入到 database 之前过滤来自用户的任何数据。 filter_input()' 等特殊字符转换为 ' 并以这种方式保存,例如

 I'm going to shopping with Molly's sister;Dolly

.我的问题是

如何使用 htmlspecialchars 向用户屏幕打印(输出)撇号或引号以及特定的特殊字符,以便输出对用户友好

我曾尝试使用 htmlspecialchars($post,ENT_NOQUOTES);,但它会给我存储在数据库中的相同数据副本。如果我不使用 htmlspecialchars() ,只是 $post 给了我预期的结果,我认为它容易受到 XSS 攻击

感谢您的宝贵时间,期待得到同行的帮助。

编辑

我得到了使用 htmlspecialchars_decode()html_entity_decode() 的建议,但是( https://stackoverflow.com/users/1338292/ja͢ck )还有一些人建议不要使用这些函数在屏幕上输出数据。

请注意,我正在使用准备好的语句参数化查询。但我不想保留任何安全漏洞,这就是为什么在发送到数据库之前过滤数据.

因为我在发送到数据库之前使用了filter_input()来过滤数据,直接从数据库输出数据($post=$posted_data;)是否安全使用 htmlspecialchars?

如果我必须要用htmlspecialchars输出数据,那么这种情况下我该怎么做呢?

代码示例

 $stmt1=mysqli_stmt_init($connect_dude);

/*Inserting into database*/

if(isset($_POST['titlex']) && isset($_POST['pricex']) && isset($_POST['detailx'])){
$tit=filter_input(INPUT_POST,'titlex',FILTER_SANITIZE_STRING);
$pri=preg_replace('#[^0-9]#','',$_POST['pricex']);
$det=filter_input(INPUT_POST,'detailx',FILTER_SANITIZE_STRING);

$query2="INSERT INTO `hotel1`.`dine` (user_id,title,price,detail) VALUES (?,?,?,?)";

mysqli_stmt_prepare($stmt1,$query2);
mysqli_stmt_bind_param($stmt1, "isis", $logged_id, $tit, $pri, $det);
mysqli_stmt_execute($stmt1);
}

/*Get Data from DB*/

$query1="SELECT id101,title,price,detail FROM `hotel1`.`dine` WHERE user_id=?";

mysqli_stmt_prepare($stmt1,$query1);
mysqli_stmt_bind_param($stmt1, "i", $user_idx);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $id101, $title,$price, $detail);

while(mysqli_stmt_fetch($stmt1)){
$id101=$id101;
$title=$title; //htmlspecialchars needed
$price=$price; //htmlspecialchars needed
$detail=$detail; //htmlspecialchars needed

........................
........................
}

最佳答案

I am using filter_input() to filter any data that comes from user before inserting into database.

这是一种不好的做法。在将数据插入数据库之前不要破坏它。现在是 2015 年;不要清理,而是使用准备好的语句。

$db = new \PDO(
'mysql:host=localhost;dbname=mydatabase;charset=UTF-8',
$username,
$password
);

// other stuff in between

$statement = $db->prepare(
"INSERT INTO yourtable (email, username) VALUES (:email, :username);"
);
$success = $statement->execute([
':email' => $_POST['email'],
':username' => $_POST['username']
]);

准备好的语句消除了对 filter_input() 的需要。这样做不会增加纵深防御,只会破坏数据完整性并让自己头疼。

渲染输出时,如果要允许 HTML,请使用 HTML Purifier .

否则,使用 htmlspecialchars($output, ENT_QUOTES | ENT_HTML5, 'UTF-8') 以获得最佳结果。

推荐阅读:Web Application Security作者:泰勒·霍恩比。

关于php - 使用已使用 filter_input() 过滤的 htmlspecialchars() 从数据库输出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com