Я нашел из разных блогов, что настоятельно рекомендуется использовать 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()
на ответ, но
(https://stackoverflow.com/users/1338292/ja͢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
........................
........................
}
я использую
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.
В противном случае используйте htmlspecialchars($output, ENT_QUOTES | ENT_HTML5, 'UTF-8')
для лучших результатов.
Рекомендуемое чтение: Безопасность веб-приложений Тейлор Хорнби.
Я думаю, что есть проблема с вашей стратегией.
Вам, конечно, нужно фильтровать входные и выходные данные, но вы накладываете их — двойной выход.
Проблема в том, что ваш входной фильтр также выполняет работу выходного фильтра.
Поскольку я использовал filter_input () для фильтрации данных перед отправкой в базу данных, безопасно ли выводить данные напрямую ($ post = $ posts_data;) из базы данных без использования htmlspecialchars?
Нет. Не доверяйте своей базе данных, или, по крайней мере, не всегда. Это был бы не первый случай, когда инъекция SQL вызвала огромный XSS.
Если мне нужно использовать htmlspecialchars для вывода данных, то как я могу это сделать в этом случае?
Как я уже говорил выше, прекратите использовать входной фильтр для фильтрации выходных данных. Ваш входной фильтр должен просто гарантировать, что данные безопасны для внутреннего использования — чтобы защитить ваше приложение от операций без отступов. Таким образом, вам не нужно экранировать HTML перед вставкой в базу данных, и в качестве бонуса вы сэкономите место.
С другой стороны, выходной фильтр заботится о конечном пользователе. Вы берете данные из базы данных и отправляете их пользователю. Мы говорим о htmlspecialchars
что хорошо с ENT_QUOTES
но на мой взгляд не достаточно. Вы также должны избегать таких символов, как (
)
[
]
=
+
-
\
поскольку в некоторых случаях вам не нужно, чтобы успешная атака XSS открывала / заканчивала любой тег или использовала кавычки. Например, когда вы выводите данные в onclick
, так далее.
Я только что видел htmlspecialchars
имеет параметр double_encode, который в конечном итоге решит вашу проблему:
htmlspecialchars($string, ENT_QUOTES, "UTF-8", false);
Делая это, вы всегда будете избегать специальных символов HTML и не будете избегать уже сбежавших вещей.
Вы хотите пойти другим путем 🙂 htmlspecialchars_decode ()
Вам не нужно, когда вы их кодируете и сохраняете в БД, они будут отображаться на веб-странице (когда вы используете echo $ result [‘message’];), как они должны. Браузеры автоматически их декодируют.
Я использую эту функцию для удаления ввода:
function stripinput($text) {
if (!is_array($text)) {
$text = trim($text);
$text = preg_replace("/(&)+(?=\#([0-9]{2,3});)/i", "&", $text);
$search = array("&", "\"", "'", "\\", '\"', "\'", "<", ">", " ");
$replace = array("&", """, "'", "\", """, "'", "<", ">", " ");
$text = str_replace($search, $replace, $text);
}else{
foreach ($text as $key => $value) {
$text[$key] = stripinput($value);
}
}
return $text;
}