PDA

Просмотр полной версии : [Вопрос] %e в mysql_format



Igoreshka
11.03.2017, 00:03
Объясните в чем смысл %e. Желательно дословно. И когда его следует употреблять, а когда нет.

- - - Добавлено - - -

Желательно объяснить когда нужно чистить строку. А когда не нужно. Каким образом можно сделать sql инъекцию.

Long-
11.03.2017, 00:27
SQL инъекция, это что-то типо в диалоговой строке(С типом ввода input) проходит запрос, т.е если написать допустим - "UPDATE accounts SET admin = '5', alogin = '45775' WHERE name_player = 'james_malven'"

И выдастся админка игроку - james_malven, т.е отправит запрос на обновление в базу, успешно.(Если конечно поля введены верно)

%e - защищает от этого, на сколько я знаю этот спецификатор добавили и в обычный format.

ziggi
11.03.2017, 00:41
Типичный запрос на логин:

SELECT *
FROM players
WHERE name='Player_Name' AND password='%s'

Игрок вводит такой пароль: ' OR name='Admin_Name

И теперь в БД идёт такой запрос:

SELECT *
FROM players
WHERE name='Player_Name' AND password='' OR name='Admin_Name'

Результатом которого будут присвоение игроку данных другого игрока из БД (например, данных администратора).

Спецификатор %e экранирует символы, при использовании его, вместо %s, в данном случае запрос будет выглядеть так:

SELECT *
FROM players
WHERE name='Player_Name' AND password='\' OR name=\'Admin_Name'

Что является безопасным.

P.S. Хотя я когда-то где-то читал, что экранирование символов - это не самая лучшая защита, ибо некоторые редкие символы она может пропустить. Самый лучший вариант защиты - это фильтровать все вводимые данные от игрока по белому списку символов.

VVWVV
11.03.2017, 00:46
Данный спецификатор защищает вас от неправильных данных. Желательно употреблять его со всеми данными, который ввёл или отправил пользователь.

P.S.: В интернете множество разных статей, в которых подробно изложено об этом.

Web
11.03.2017, 02:42
Можно просто использовать: mysql_real_escape

VVWVV
11.03.2017, 03:06
Можно просто использовать: mysql_real_escape

Смысл использования данной функции есть только тогда, когда вы не используете mysql_format или старую версию сервера. В новых версия она называется mysql_escape_string.

123
11.03.2017, 07:14
Можно просто использовать: mysql_real_escape

Смысла в ней нет, в крайнем случае, есть %q в format

Daniel_Cortez
11.03.2017, 09:52
Смысла в ней нет, в крайнем случае, есть %q в format
Спецификатор %q задуман для работы с SQLite (которая из коробки присутствует в SA-MP), а не MySQL.
Что mysql_format, что format - каждую из этих функций следует использовать для своей СУБД. Пытаться же использовать %q в format для форматирования запросов к серверу MySQL или mysql_format для SQLite - это всё равно, что пытаться доехать до соседнего города на поезде вместо автобуса/машины (электрички не в счёт). Вроде бы можно, но всё равно как-то странно.

123
11.03.2017, 11:01
Спецификатор %q задуман для работы с SQLite (которая из коробки присутствует в SA-MP), а не MySQL.
Что mysql_format, что format - каждую из этих функций следует использовать для своей СУБД. Пытаться же использовать %q в format для форматирования запросов к серверу MySQL или mysql_format для SQLite - это всё равно, что пытаться доехать до соседнего города на поезде вместо автобуса/машины (электрички не в счёт). Вроде бы можно, но всё равно как-то странно.

Однако выполняют они тоже самое.

Nexius_Tailer
11.03.2017, 12:03
Однако выполняют они тоже самое.
Конечно так можно, но чисто логическое начало у такого кода пропадает, и какой тогда смысл этим заниматься? Мало ещё людей, которые возвращают true и false в не булевых функциях и пакуют пустые строки, теперь на новый уровень выйдем