[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: данные от пользователя
sg.com
коротко из статьи phpfaq.ru (для MySQL):

1. Все строковые данные в запросе к БД в т.ч. и даты, должны быть в кавычках (одинарных или двойных, чаще бывает в одинарных).

2. Спецсимволы должны экранироваться обратным слэшем, например - (Маша по прозвищу \'Грей\'). Добавленные слэши в БД не добавляются, поэтому при выводе из базы stripslashes применять не нужно.

3. Числа так же можно прослэшивать как и строки или приводить к нужному типу, например - intval($id).

4. Имена полей и таблиц следует заключать в обратные кавычки, эта клавиша находится слева от клавиши "1".

5. Опция волшебные кавычки экранирует данные от пользователя еще до попадания их в скрипт, поэтому могут быть неожиданные результаты. Так же при использованию кодировки unicode "волшебные кавычки" могут принять часть кодировки (мультибайтной) за спецсимвол и заслэшить его, что приведет к некорректной обработке/отображении информации. Поэтому опцию "волшебные кавычки" отключают и делают прослэшивание вот так:
$name = mysql_real_escape_string($name);
$query = "INSERT INTO `table_name` (name) VALUES ('$name')";

если запрос с оператором LIKE, то
 $query = "SELECT * FROM `table_name` name LIKE
'"
.mysql_real_escape_string($_GET['name'])."%'";

Вместо $_GET['name'] вернее будет прописать $get_name, предварительно обрезав пробелы, если есть и ограничив длину при необходимости (ф. - trim, substr). Для структурной проверки информации используйте ф. - filter_var

6. Если в запросе есть динамически меняющиеся команды SQL или имена полей то все варианты подстановки необходимо прописывать отдельно, не вставлять их напрямую из запросов. Это от SQL инъекций.
don.bidon
От инъекций PDO (https://www.php.net/manual/en/book.pdo.php) юзать надо.
sg.com
о PDO начал читать, но в продолжение, из той же статьи:

как и в PDO, mysqli так же реализуют принцип "подготовки выражений" (prepared statements):
SELECT * FROM table WHERE name=?

Знак вопроса здесь - это маркер, он так же называется плейсхолдером (placeholder). Данные на его место подставляет специальная функция, которая "привязывает" переменную к запросу:
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?"); // подготовка шаблона
$stmt->bind_param("s", $city); // привязываем к маркеру значение переменной $city
$stmt->execute(); // выполняем подготовленный запрос.

При этом запрос и данные идут в базу не вместе, а по отдельности, исключая возможность какой-либо ошибки или злонамеренной манипуляции.

// это только пример (что наз. плейсхолдером)
sg.com
да и, собс-но, пример на PDO:
if(ctype_digit($_POST['id']) && is_int($_POST['id'])) {
$validatedId = $_POST['id'];
$pdo = new PDO('mysql:store.db');
$stmt = $pdo->prepare('SELECT * FROM transactions WHERE user_id = :id');
$stmt->bindParam(':id', $validatedId, PDO::PARAM_INT);
$stmt->execute();
} else {
// отклонить значение id и сообщить пользователю об ошибке
}

да и пишут, что
Цитата
экранирование — не лучший вариант защиты. Оно может понадобиться, если используемая вами для абстракции библиотека БД допускает настройку голых SQL-запросов или частей запроса без принудительной привязки параметров. В остальных случаях лучше вообще избегать изолирования. Этот подход сложен, провоцирует ошибки и различается в зависимости от расширения базы данных... Также согласованная привязка параметров гораздо надёжнее, чем попытка не забыть, что нужно изолировать всё вручную.


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.