Всем привет, сегодня разберу такую тему, с которой многие могли столкнуться открывая свои копии Arizona RP, сегодня я расскажу вам, как исправить недочеты, чтобы с помощью команд не смогли делать запросы в базу данных к примеру:
Основная причина таких уязвимостей - под ввод подставляется запись или строчка с бд, чтобы заменить или уложить ваш сервер.
Как избежать? Не делать что-то подобное:
Экранирование - ключ к успеху в данной ситуации, как же его сделать и обезопасить свой сервер? Все очень просто.
Перед вставкой строк в SQL необходимо экранировать ваш запрос, а то-есть:
Для многих полей лучше использовать белый список символов путём поиска строк:
Так-же лучше работать через числовые идентификаторы, пример:
- плохой пример
- хороший пример
Ограничивайте функции
До SQL запроса где требуются админ-права всегда ставьте проверку первее чем запрос
Так-же желательно делать валидацию символов (можно вместо
Надеюсь помог, запарился над данной темой, буду рад лайку <3
/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
Последнее редактирование модератором: