Как вставить htmlentities в MySQL? - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу защитить свой сайт от атак XSS. Для этого я использую htmlentites. Когда я пытаюсь вставить свою переменную в MySQL, я получаю сообщение об ошибке?

$var = htmlentities("<script>alert('hello')</script>");
$conn = mysqli_connect("localhost","root","","xss");
//mysqli_query($conn,"INSERT INTO entities (ent) VALUES('$var')");
if (!mysqli_query($conn,"INSERT INTO entities (ent) VALUES('$var')"))
{
    echo("Error description: " . mysqli_error($conn));
}
echo $var; 

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Правильный ответ: ты не должен этого делать. Не сохраняйте результат 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>';
0 голосов
/ 11 ноября 2019

Вы можете использовать функцию mysqli_real_escape_string (), чтобы очистить данные перед вставкой в ​​базу данных

$var = htmlentities("<script>alert('hello')</script>");
 $conn = mysqli_connect("localhost","root","","xss");
// add this line to sanitize the string before inserting into the database
$var = mysqli_real_escape_string($conn, $var);
if (!mysqli_query($conn,"INSERT INTO entities (ent) VALUES('$var')"))
 {
    echo("Error description: " . mysqli_error($conn));
 }
 echo $var; 

Надеюсь, эта помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...