Как избежать вывода в PHP


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

Это то, что я делаю в настоящее время -

$s = mysqli_real_escape_string($connect,$_POST['name']));

Достаточно ли этого? Спасибо

Author: Nanne, 2011-02-28

3 answers

Если вы выводите данные в HTML, вы должны использовать функции htmlspecialchars() еще, если вы храните данные в базе данных, вы должны защитить строки, используя mysqli_real_escape_string() и Cast (или использовать подготовленные заявления для обоих) и защитить идентификаторы/операторов на основе белого списка, когда фильтрации.

Оба этих метода - это все, что вам нужно, если вы используете их правильно.

 7
Author: SuperSpy, 2011-02-28 11:56:20

Вы должны использовать специальные символы html для вывода, а не строка mysqli_real_escape_string.

 4
Author: Tokk, 2011-02-28 11:46:52

Если вы только начинаете исправлять свой код от атак (имеется в виду Атаки с использованием 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, поэтому вы будете в безопасности автоматически.

 0
Author: Nanne, 2011-02-28 11:51:04