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

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

3 голосов
/ 28 февраля 2011

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

Это то, чем я сейчас занимаюсь -

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

Этого достаточно?Спасибо

Ответы [ 3 ]

7 голосов
/ 28 февраля 2011

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

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

4 голосов
/ 28 февраля 2011

Вы должны использовать htmlspecialchars для вывода вместо mysqli_real_escape_string .

0 голосов
/ 28 февраля 2011

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

...