Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

Инъекции SQL [ARZ]

Июн
27
6
Пользователь
Всем привет, сегодня разберу такую тему, с которой многие могли столкнуться открывая свои копии Arizona RP, сегодня я расскажу вам, как исправить недочеты, чтобы с помощью команд не смогли делать запросы в базу данных к примеру: /setadmtag 0 FF0000 ', password='123123' — (заменяет пароли всех аккаунтов в базе данных на 123123).

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

Как избежать? Не делать что-то подобное:
Pawn:
mysql_format(mysql, text, sizeof(text), "SELECT * FROM accounts WHERE Name='%s'", inputtext);

Экранирование - ключ к успеху в данной ситуации, как же его сделать и обезопасить свой сервер? Все очень просто.

Перед вставкой строк в SQL необходимо экранировать ваш запрос, а то-есть:
Pawn:
new query[256];
mysql_escape_string(inputtext, query);
mysql_format(mysql, text, sizeof(text), "SELECT * FROM accounts WHERE Name='%s'", query);

Для многих полей лучше использовать белый список символов путём поиска строк:
if(strfind(inputtext, "", true) != -1) и так далее

Так-же лучше работать через числовые идентификаторы, пример:
SQL:
UPDATE family SET Leader = '%s'
- плохой пример
SQL:
UPDATE family SET LeaderID = %d WHERE FamilyID = %d LIMIT 1
- хороший пример

Ограничивайте функции Update / Delete, всегда используйте LIMIT 1 если запрос должен изменить только одну запись, это дополнительно защитит от изменения данных

До SQL запроса где требуются админ-права всегда ставьте проверку первее чем запрос

Так-же желательно делать валидацию символов (можно вместо strfind),пример:
Pawn:
if((symbol >= 'A' && symbol <= 'Z') || (symbol >= 'a' && symbol<= 'z') || (symbol >= '0' && symbol <= '9') || symbol == '_' || symbol == ' ')

Надеюсь помог, запарился над данной темой, буду рад лайку <3
 
Последнее редактирование модератором:
Сверху