热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用已使用filter_input()过滤的htmlspecialchars()从数据库输出数据》经验,为你挑选了1个好方法。

我从不同的博客中发现,强烈建议用它htmlspecialchars()来输出屏幕上的任何数据以免安全XSS Attack.

filter_input()用来过滤插入之前来自用户的任何数据database.filter_input()转换特殊字符,如''并保存它的方式,像

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

我的问题是

How can I print(output) apostrope or quotes and specific special characters to users screen using htmlspecialchars so that the output would be user friendly

我试图使用htmlspecialchars($post,ENT_NOQUOTES);,但它给了我存储在数据库中的相同数据副本.如果我不使用htmlspecialchars(),只$post给我预期的结果,我认为很容易XSS Attack

感谢您的时间,并期待从同行那里获得帮助.

编辑

我有建议使用htmlspecialchars_decode()html_entity_decode()回答,但(/sf/ask/17360801/͢ck)和其他一些建议不要使用这些functions来输出屏幕上的数据.

请注意我正在使用prepared statementparameterized query.但我不想保留任何安全漏洞,这就是为什么在发送到数据库之前过滤数据.

因为我曾经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

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

Scott Arcisz.. 8

filter_input()用来过滤插入之前来自用户的任何数据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')以获得最佳效果.

推荐阅读:Taylor Hornby的Web应用程序安全性.



1> Scott Arcisz..:

filter_input()用来过滤插入之前来自用户的任何数据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')以获得最佳效果.

推荐阅读:Taylor Hornby的Web应用程序安全性.


我已经使用`prepared statement`和`参数化查询`了.但是我不想保留任何安全漏洞,这就是为什么在发送到数据库之前过滤数据的原因.
我只想再次强调,输出的清理是你需要做的事情__on output__,而不是当你将它插入数据库时​​.插入前进行消毒只会导致数据损坏.
推荐阅读
author-avatar
福田商务汽车--南宁鑫来
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有