Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> данные от пользователя, как обработать данные от пользователя - короткая подсказка
sg.com  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 247
Пользователь №: 42899
На форуме: 9 лет, 2 месяца, 19 дней
Карма: 5




коротко из статьи 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 инъекций.

Это сообщение отредактировал sg.com - 30.03.2025 - 20:43
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
don.bidon  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 56
Пользователь №: 46417
На форуме: 2 года, 4 месяца, 22 дня
Карма:




От инъекций PDO (https://www.php.net/manual/en/book.pdo.php) юзать надо.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 247
Пользователь №: 42899
На форуме: 9 лет, 2 месяца, 19 дней
Карма: 5




о 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 - 8.04.2025 - 23:04
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 247
Пользователь №: 42899
На форуме: 9 лет, 2 месяца, 19 дней
Карма: 5




да и, собс-но, пример на 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-запросов или частей запроса без принудительной привязки параметров. В остальных случаях лучше вообще избегать изолирования. Этот подход сложен, провоцирует ошибки и различается в зависимости от расширения базы данных... Также согласованная привязка параметров гораздо надёжнее, чем попытка не забыть, что нужно изолировать всё вручную.


PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 247
Пользователь №: 42899
На форуме: 9 лет, 2 месяца, 19 дней
Карма: 5




добрался то одного момента, я было подумал что подготовленный запрос с помощью библиотек это уже готовое решение, а тут вот что:
Цитата
Сервер применяет связывание параметров только для данных. Другие динамические части SQL-запроса требуется отфильтровать по известному списку разрешённых значений.

 // Динамическая часть SQL-запроса проверяется на соответствие ожидаемым значениям
$sortOrder = $_GET['sortiOrder'] === 'DESC' ? 'DESC' : 'ASC';
$productId = $_GET['productId'];

// SQL-запрос подготавливается с заполнителем
$stmt = $pdo->prepare("SELECT * FROM products WHERE id LIKE ? ORDER BY price {$sortOrder}");

// Значение передаётся с подстановочными знаками LIKE
$stmt->execute(["%{$productId}%"]);

т.е. прописывать логику все равно нужно.
... да, тему не совсем точно назвал, нужно было - "небезопасные данные от пользователя"
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса