Правильный ответ: ты не должен этого делать. Не сохраняйте результат htmlentities()
в базе данных. Эта функция предназначена для использования только тогда, когда вы выводите в контексте HTML ! Вы не можете точно знать, будут ли данные, хранящиеся в базе данных, всегда использоваться в контексте HTML.
XSS-предотвращение очень зависит от контекста. Что делать, если вы хотите вывести на JavaScript или CSV или просто искать значения в базе данных? Вы не можете сделать это, если они закодированы для вывода HTML.
Чтобы ответить на вашу более насущную проблему, я должен отметить, что ваш код уязвим для внедрения SQL. Используйте подготовленные операторы с привязкой параметров.
Правильный пример mysqli запроса INSERT
будет выглядеть следующим образом:
<?php
$var = "<script>alert('hello')</script>";
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli("localhost", "root", "", "xss");
$conn->set_charset('utf8mb4');
$stmt = $conn->prepare('INSERT INTO entities (ent) VALUES(?)');
$stmt->bind_param('s', $var);
$stmt->execute();
// use htmlentities when in HTML context
echo '<div>'.htmlentities($var).'</div>';