Объясните в чем смысл %e. Желательно дословно. И когда его следует употреблять, а когда нет.
- - - Добавлено - - -
Желательно объяснить когда нужно чистить строку. А когда не нужно. Каким образом можно сделать sql инъекцию.
Вид для печати
Объясните в чем смысл %e. Желательно дословно. И когда его следует употреблять, а когда нет.
- - - Добавлено - - -
Желательно объяснить когда нужно чистить строку. А когда не нужно. Каким образом можно сделать sql инъекцию.
SQL инъекция, это что-то типо в диалоговой строке(С типом ввода input) проходит запрос, т.е если написать допустим - "UPDATE accounts SET admin = '5', alogin = '45775' WHERE name_player = 'james_malven'"
И выдастся админка игроку - james_malven, т.е отправит запрос на обновление в базу, успешно.(Если конечно поля введены верно)
%e - защищает от этого, на сколько я знаю этот спецификатор добавили и в обычный format.
Типичный запрос на логин:
Игрок вводит такой пароль: ' OR name='Admin_NamePHP код:
SELECT *
FROM players
WHERE name='Player_Name' AND password='%s'
И теперь в БД идёт такой запрос:
Результатом которого будут присвоение игроку данных другого игрока из БД (например, данных администратора).PHP код:
SELECT *
FROM players
WHERE name='Player_Name' AND password='' OR name='Admin_Name'
Спецификатор %e экранирует символы, при использовании его, вместо %s, в данном случае запрос будет выглядеть так:
Что является безопасным.PHP код:
SELECT *
FROM players
WHERE name='Player_Name' AND password='\' OR name=\'Admin_Name'
P.S. Хотя я когда-то где-то читал, что экранирование символов - это не самая лучшая защита, ибо некоторые редкие символы она может пропустить. Самый лучший вариант защиты - это фильтровать все вводимые данные от игрока по белому списку символов.
Данный спецификатор защищает вас от неправильных данных. Желательно употреблять его со всеми данными, который ввёл или отправил пользователь.
P.S.: В интернете множество разных статей, в которых подробно изложено об этом.
Можно просто использовать: mysql_real_escape
Спецификатор %q задуман для работы с SQLite (которая из коробки присутствует в SA-MP), а не MySQL.
Что mysql_format, что format - каждую из этих функций следует использовать для своей СУБД. Пытаться же использовать %q в format для форматирования запросов к серверу MySQL или mysql_format для SQLite - это всё равно, что пытаться доехать до соседнего города на поезде вместо автобуса/машины (электрички не в счёт). Вроде бы можно, но всё равно как-то странно.