Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

player nickname bekw][]'; hlds - mysql

, 18+ (no erotic, only porn)
Статус пользователя ssx
сообщение 18.1.2015, 1:15
Сообщение #1


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Прикупил я бочонок пивка, сел за ПК и случайно на статистику своей армиранк системы (скрин №1) .. чесно, немного охренел от увиденного .

а бэкап делал последний раз 14-го числа .

Ну думаю, надо разобраться что и как ..

Полез в phpmyadmin (скрин №2) , почти все ники переименовало (теория почему не все - при выходе игрока с сервера его стата сохраняется по полю id , при этом все данные записываются включая ник)

Есть еще Psychostats, который и дал понять в чём дело (скрин №3)

Как видим в нике ';

Далее выкладываю части с кода переделаного армиранка регистрации игрока и сохранении статы:
Код:
new Handle:Query = SQL_PrepareQuery(SqlConnection,"INSERT INTO %s (`id`,`name`,`exp`,`level`,`SteamId`,`LastVisit`) VALUES (NULL,'%s','0','1','%s','%d');",szTableName,szName,szSteam,g_sys_time);


Код:
format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);


Теперь вопрос знатокам, как сделать так что бы не смогли снова так нагадить?!
Знаю что надо как-то экранировать (или как там его) но как именно не знаю .

Дополнительная инфа об игроке
L 01/17/2015 - 18:59:52: "Kukushonok<156><STEAM_0:0:551875182><>" connected, address "78.85.173.221:11355"

psychostats ники и стим_ид
bekw][]';
Kukushonok
STEAM_0:0:552877192
STEAM_0:0:551875182

armyrank ник
bekw][]

145.255.173.38
78.85.173.221

Прикрепленные файлы:
Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
voed
сообщение 18.1.2015, 1:21
Сообщение #2
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Как минимум
Код:
replace_all(...,..., "'", "")

А так неплохо бы увидить исходник
Браво автору плагина, даже я, делая свой первый плагин с mysql, не оставлял таких дыр
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 18.1.2015, 1:28
Сообщение #3


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Цитата(voed @ 18.1.2015, 1:21) *
Как минимум
Код:
replace_all(...,..., "'", "")

А так неплохо бы увидить исходник
Браво автору плагина, даже я, делая свой первый плагин с mysql, не оставлял таких дыр


Исходник плагина.


Логика была такая:
Перед новым годом сделал так что бы при заходе искало по стим_ид, если нету то по нику .
При выходе сохранит со стим_ид (и с новым ником если менял в игре игрок)
После 31.01.2015 просто удалить всех тех кто без стим_ид и выбросить проверку на ник.
Далее уже придумать скрипт который будет раз в n времени удалять тех кто n времени не заходил на сервер.


Помогите исправить дыру пожалуйста! (ну и если есть варианты как оптимизировать то тоже помогите)


П.С. нашел replace_all но не понял как заюзать .

Отредактировал: ssx, - 18.1.2015, 1:32
Прикрепленные файлы:
Прикрепленный файл  army_ranks.sma ( 23,67 килобайт ) Кол-во скачиваний: 11


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 1:42
Сообщение #4
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

В исходнике amxbans есть вот такой сток
Код:
stock mysql_escape_string(dest[], len)
{
replace_all(dest, len, "\\", "\\\\")
replace_all(dest, len, "\0", "\\0")
replace_all(dest, len, "\n", "\\n")
replace_all(dest, len, "\r", "\\r")
replace_all(dest, len, "\x1a", "\Z")
replace_all(dest, len, "'", "\'")
replace_all(dest, len, "^"", "\^"")
}

Юзай его перед всеми INSERT/UPDATE запросами, можно вместо SQL_QuoteString
Например, строка 436
Код:
SQL_QuoteString(SqlConnection, szName, 32, szName);

>
Код:
mysql_escape_string(szName, 32)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 18.1.2015, 1:53
Сообщение #5
Стаж: 14 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

voed,
SQL_QuoteString не достаточно?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 1:58
Сообщение #6
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата(proff_q @ 18.1.2015, 1:53) *
voed,
SQL_QuoteString не достаточно?

В данном плагине эта функция вообще не работает по каким-то причинам. Ну или отсутствует в нужном месте, не вникал особо в код
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 18.1.2015, 2:06
Сообщение #7
Стаж: 14 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

voed, Так как я не особо силен в веб части, ответь пожалуйста на вопрос, в посте #4 полный список символов, который может напортачить базу?
И все таки, не для данного плагина, хватает ли функции SQL_QuoteString? По описанию она делает тоже самое, что и пост #4, но только ли с одинарными кавычками?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 2:21
Сообщение #8
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата(proff_q @ 18.1.2015, 2:06) *
voed, Так как я не особо силен в веб части, ответь пожалуйста на вопрос, в посте #4 полный список символов, который может напортачить базу?
И все таки, не для данного плагина, хватает ли функции SQL_QuoteString? По описанию она делает тоже самое, что и пост #4, но только ли с одинарными кавычками?

Она выполняет C++ функцию mysql_escape_string, которая должна делать все точно то же самое, что и этот сток, поэтому ее должно быть более чем достаточно. Вопрос в другом - почему она не работает

upd погуглил немного
http://dev.mysql.com/doc/refman/5.0/en/mys...ape-string.html
Цитата
Use mysql_real_escape_string() instead!

This function is identical to mysql_real_escape_string() except that mysql_real_escape_string() takes a connection handler as its first argument and escapes the string according to the current character set.

Если я правильно понимаю, дело в кодировке. SQL_QuoteString не умеет читать кодировку, поэтому и не хочет заменять. Хотя, могу и ошибаться

Отредактировал: voed, - 18.1.2015, 2:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 18.1.2015, 2:29
Сообщение #9
Стаж: 14 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Не выполняет, потому что ее там нет.
Код:
case 1: 
{
new szTemp[512],szTable[64];
get_pcvar_string(gTableName,szTable,63);
format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
SQL_ThreadQuery(g_SqlTuple,"QueryHandler",szTemp)

server_print("==========================================");
server_print("UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
server_print("==========================================");
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
voed
сообщение 18.1.2015, 2:41
Сообщение #10
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

proff_q, ну да, логично, ведь кодировку умеет только amxmodx 1.8.3
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ssx
сообщение 18.1.2015, 2:43
Сообщение #11


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

У меня "AMX Mod X 1.8.3-dev+f097e01"

То есть получается вот так вот надо ?
Код:

case 1:
{
new szTemp[512],szTable[64];
get_pcvar_string(gTableName,szTable,63);
SQL_QuoteString(SqlConnection, szName, 32, szName);
format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
SQL_ThreadQuery(g_SqlTuple,"QueryHandler",szTemp)

server_print("==========================================");
server_print("UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
server_print("==========================================");
}




Назревает второй вопрос о бэкапе БД.
Как видим, испортились только ники игроков. Опыт, стим_ид и timestamp все гуд .


Каким sql запросом можно с резервной копии базы обновить поля name по id ?
так хоть тех кого по нику должно искать спасти удастся.

Отредактировал: ssx, - 18.1.2015, 2:45


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 18.1.2015, 9:38
Сообщение #12
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

voed, что за фигню ты кидаешь?
Код:
replace_all(dest, len, "\\", "\\\\")
replace_all(dest, len, "\0", "\\0")
replace_all(dest, len, "\n", "\\n")
replace_all(dest, len, "\r", "\\r")

Когда там в коде ctrlchar '^'.

Отредактировал: [WPMG]PRoSToTeM@, - 18.1.2015, 9:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 9:50
Сообщение #13
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

[WPMG]PRoSToTeM@, я писал выше, что особо не вникал в код. Я скинул сток, который я юзал, да и не знал, что SQL_QuoteString на самом деле mysql_escape_string
Кстати, неплохо бы отписать, чтоб заменили mysql_escape_string на mysql_real_escape_string
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 18.1.2015, 9:56
Сообщение #14
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(voed @ 18.1.2015, 10:50) *
Кстати, неплохо бы отписать, чтоб заменили mysql_escape_string на mysql_real_escape_string

Зачем?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 9:59
Сообщение #15
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата([WPMG]PRoSToTeM@ @ 18.1.2015, 9:56) *

Зачем?

Цитата
mysql_real_escape_string() takes a connection handler as its first argument and escapes the string according to the current character set.

Чтоб не было проблем с кодировкой

Отредактировал: voed, - 18.1.2015, 9:59
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 18.1.2015, 10:00
Сообщение #16
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(voed @ 18.1.2015, 10:59) *
Чтоб не было проблем с кодировкой

А каких конкретно?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 18.1.2015, 10:03
Сообщение #17
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата([WPMG]PRoSToTeM@ @ 18.1.2015, 10:00) *

А каких конкретно?

Ну раз в документации написано, что надо, значит видимо какие-то были. Конечно, мало кто решит использовать экзотические кодировки для запросов, но мало ли
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 18.1.2015, 10:06
Сообщение #18
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(voed @ 18.1.2015, 11:03) *
Ну раз в документации написано, что надо, значит видимо какие-то были. Конечно, мало кто решит использовать экзотические кодировки для запросов, но мало ли

ИМХО Юникода всегда хватает, экзотика ни к чему.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 18.1.2015, 10:19
Сообщение #19
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Вообще для SQL_QuoteString у выходного буфера должен быть charsmax вдвое больше чем у входного. (т.е. для ника исходный массив с 32 ячейками, а выходной должен быть (32 - 1) * 2 + 1 = 63)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 18.1.2015, 21:11
Сообщение #20


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

вообще запутался как правильно сделать ...


Вот так вот не прокатывает

Код:
{
new szTemp[512],szTable[64];
get_pcvar_string(gTableName,szTable,63);
SQL_QuoteString(SqlConnection, szName, 32, szName);
format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
SQL_ThreadQuery(g_SqlTuple,"QueryHandler",szTemp)

server_print("==========================================");
server_print("UPDATE `%s` SET `name`='%s',`exp`='%d',`level`='%d',`SteamId`='%s',`LastVisit`='%d' WHERE `id`='%d';",szTable,szName,UserData[id][gExp],UserData[id][gLevel],szSteam,g_sys_time,
UserData[id][gId]);
server_print("==========================================");
}


ругается на Код:
SQL_QuoteString(SqlConnection, szName, 32, szName);

не компилирует

Код
//// army_ranks.sma
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: error 017: undefined symbol "SqlConnection"
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: warning 215: expression has no effect
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: warning 215: expression has no effect
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: warning 215: expression has no effect
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: error 001: expected token: ";", but found ")"
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: error 029: invalid expression, assumed zero
// D:\user0\Server_CS_27014\cstrike\addons\amxmodx\scripting\army_ranks.sma(516)
: fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 4 Errors.
// Could not locate output file D:\user0\Server_CS_27014\cstrike\addons\amxmodx\
scripting\compiled\army_ranks.amx (compile failed).
//
// Compilation Time: 0.14 sec



Отредактировал: ssx, - 18.1.2015, 21:12


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: