我从不同的博客中发现,强烈建议用它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 statement
和parameterized 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__,而不是当你将它插入数据库时.插入前进行消毒只会导致数据损坏.