Как избежать вывода в PHP
Я новичок, просто для ясности. Я много слышал об ускользании данных для предотвращения XSS-атак. Как мне на самом деле это сделать?
Это то, что я делаю в настоящее время -
$s = mysqli_real_escape_string($connect,$_POST['name']));
Достаточно ли этого? Спасибо
3 answers
Если вы выводите данные в HTML, вы должны использовать функции htmlspecialchars() еще, если вы храните данные в базе данных, вы должны защитить строки, используя mysqli_real_escape_string() и Cast (или использовать подготовленные заявления для обоих) и защитить идентификаторы/операторов на основе белого списка, когда фильтрации.
Оба этих метода - это все, что вам нужно, если вы используете их правильно.
Вы должны использовать специальные символы html для вывода, а не строка mysqli_real_escape_string.
Если вы только начинаете исправлять свой код от атак (имеется в виду Атаки с использованием SQL-инъекций ), вам будет лучше проверить параметризованные запросы. То, что вы в основном делаете с ними, - это отделяете свой контент (ввод) от команд (sql), чтобы вы никогда не могли их перепутать из-за возможной коварной информации, введенной пользователем, такой как имя.
Вы можете попробовать начать с использования класса PDO
:
Вы можете начать читать руководство PDO
здесь: http://php.net/manual/en/book.pdo.php и на этой странице есть хороший пример: http://php.net/manual/en/pdo.prepared-statements.php
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
Однако вам не нужно использовать PDO
, вы также можете использовать mysqli
, см. http://php.net/manual/en/mysqli.prepare.php
<?php
/* Script A -- We are already connected to the database */
$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */
mysqli_stmt_bind_param($stmt, "si", $string, $integer);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt); // CLOSE $stmt
?>
Поскольку имя является отдельным значением, оно никогда не может быть командой SQL, поэтому вы будете в безопасности автоматически.