Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Защита от инъекций

Kazon

Компетентный
Добрый день пользователи Pawno-Info.ru

Защита от инъекций:
Я стал замечать что всё больше и больше пользователей стараются изучить MySQL но они не понимают, что их ожидает
И что им предстоит узнать. Часто встречался с такими людьми которые задавались вопросом как же защитится от
MySQL инъекций? Разные пользователи придумывают разные варианты и уверенно себе внушают что это их защитит от инъекций.

Часто встречал такие методы защиты:

PHP:
static query[80];
format(query, sizeof(query), "SELECT * FROM `AdminsInfo` WHERE `Name` = '%s'", name);
mysql_function_query(Mysql, query, true, "MyPublic", "i", playerid);
[HR][/HR]
Тем самым некоторые пользователи уверенно думают, что они тем самым защищают себя от MySQL инъекций

Запомните раз и навсегда static отличается от new тем, что static создаётся 1 раз в памяти и остаётся там до завершения программы
А new создаётся каждый раз при вызове функции и очищается по её окончании. Так что не рекомендую использовать static это ничем не поможет.
[HR][/HR]
Так какие же есть способы защиты?
Есть несколько способов защиты может я знаю не все но расскажу о тех которые мне извесны:
[HR][/HR]
mysql_format:

Позволяет форматировать строки, которые можно смело использовать в запросе.

Параметры:
PHP:
(Handle, output[], format[], {Float,_}:...)
HandleСоединение которое вы используете (Переменная = mysql_connect)
output[]Строка куда будет выводится результат.
format[]Само форматирование
{Float,_}:...Неопределённое количество аргументов(параметров)
Эта функция не возвращает никакого значения!

Параметры форматирования
%eВставляет строку которую надо проверить(string %s)
%sВставляет строку в формат(String)
%fВставляет значение с точкой(Float)
%i, %dВставляет целое значение числа(Integer)

Правильное использование:
PHP:
new query[100];
mysql_format(Mysql, query,  "SELECT * FROM `AdminsInfo` WHERE `Name` = '%e'", name);
mysql_function_query(Mysql, query, true, "MyPublic", "i", playerid);
От меня:
Так же замечал, что пользователи очень боятся этой функции так как про неё пускают слухи, что она багнутая
Но на самом деле это не так функция часто вызывает крэш мода в тех случаях когда её используют в ненужных
Случаях то есть когда вы не используете в форматировании %e или эта строка имеет русские символы
В таких случаях мод крэшится. И не опытные скриптеры в случае своей неудачи распускают такие слухи.
Но если же вы так её боитесь что вам страшно спать xD то пожалуйста, используйте mysql_real_escape_string
[HR][/HR]
mysql_real_escape_string:

Используйте эту функцию если вы хотите проверить строку на запрещенные символы
Важно:
Всегда используйте эту функцию если вы не используете mysql_format!
Иначе вы можете быть жертвой инъекции.

Параметры:
PHP:
(const source[], destination[], Handle)
const source[]Строка которая будет сканирована
destination[][]Строка куда будет выведен результат
Handle[]Соединение которое вы используете (Переменная = mysql_connect)
Эта функция возвращает количество сканированных символов!

Правильное использование:
PHP:
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
mysql_real_escape_string(PlayerInfo[playerid][pName], name);
format(query, sizeof(query), "SELECT * FROM `AdminsInfo` WHERE `Name` = '%s'", name);
mysql_function_query(Mysql, query, true, "MyPublic", "i", playerid);
От меня:
Как по мне удобнее и проще использовать mysql_format
И ещё по меньше слушайте других а если всё же послушали то лучше удостовериться

Copyrights © Kazon™
 
Последнее редактирование:
Сверху Снизу