Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для verteich
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2019
    Сообщений
    117
    Репутация:
    2 ±

    sscanf string buffer overflow

    PHP код:
    CMD:makeadmin(playeridparams[])
    {
        if(
    PI[playerid][pAdmin] < 5) return 0;
        if(!
    ADuty{playerid}) return SendClientMessage(playeridCOLOR_GREYNO_DUTY_TEXT);
        new 
    id,admin,string[200];
        if(
    sscanf(params,"ud",id,admin)) return SendClientMessage(playerid,COLOR_RED,"Используйте: /makeadmin [id] [level (0 - 6)]");
        if(!
    IsPlayerConnected(id)) return 0;
         if(
    GetString(PN(id), !"Mihail_Zubenko") || GetString(PN(id), !"Brian_DeSanto") || GetString(PN(id), !"Van_Kard"))
        return 
    0;
        if(
    PI[playerid][pAdmin] <= PI[id][pAdmin])
        {
            
    SendClientMessage(playerid,COLOR_RED,"Отказано в доступе!");
            
    format(string,sizeof(string),"Игрок %s[%d] пытается снять админа %s",PN(playerid),playerid,PN(id));
            
    SendAdminsMessage(COLOR_RED,string);
            return 
    0;
        }
        if(!
    GetString(PN(playerid),"Mihail_Zubenko") )
        {
            if(!
    IsASuccesIP(PlayerRegIP[playerid], PlayerIp[playerid]) && PI[playerid][pAdmin]<7)
            {
                
    SendClientMessage(playerid,COLOR_LIGHTRED,"Наблюдается попытка взлома!");
                
    format(string,sizeof(string),"%s [%d] подозревается во зломе, проверьте его и авторизируйте /acceptadmin [7 lvl]",PN(playerid),playerid);
                
    SendAdminsMessage(COLOR_RED,string);
                return 
    0;
             }
        }
        if(
    admin || admin 6) return SendClientMessage(playerid,COLOR_VALIK,"Используйте: /makeadmin [id] [level (0 - 6)]");
        if(
    PI[playerid][pAdmin]==&& admin 4) return SendAdminsMessage(COLOR_RED,"net!");
        
    PI[id][pAdmin] = admin;
        
    format(string,sizeof(string),"Вы выдали игроку %s %d-й уровень администратирования",Name(id),admin);
        
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
        
    format(string,sizeof(string)," %s назначил игрока %s админом %d-го уровня",Name(playerid),Name(id),admin);
        
    SendAdminsMessage(COLOR_RED,string);
        return 
    1;


  2. #2
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Много ненужного, но как-то так. А лучшее вообще использовать extract.

    А вообще, описывать проблему нужно, уважаемый. А еще, перед тем, как создать тему, прочитать правила ее оформления.
    PHP код:
    CMD:makeadmin(playeridparams[]) 
    {
        if( ( 
    GetString(PN(playerid), !"Mihail_Zubenko") || GetString(PN(playerid), !"Brian_DeSanto") || GetString(PN(playerid), !"Van_Kard") ) && !ADuty{playerid} ) 
            return 
    true;
        new 
    id,admin,string[200]; 
        if(
    sscanf(params,"ud",id,admin))
            return 
    SendClientMessage(playerid,COLOR_RED,"Используйте: /makeadmin [id] [level (0 - 6)]");
        
        if(
    PI[playerid][pAdmin] <= PI[id][pAdmin]) 
        { 
            
    SendClientMessage(playerid,COLOR_RED,"Отказано в доступе!"); 
            
    format(string,sizeof(string),"Игрок %s[%d] пытается снять админа %s",PN(playerid),playerid,PN(id)); 
            
    SendAdminsMessage(COLOR_RED,string); 
            return 
    true
        } 
        
        if(!
    IsASuccesIP(PlayerRegIP[playerid], PlayerIp[playerid]) && PI[playerid][pAdmin]<7
        { 
                
    SendClientMessage(playerid,COLOR_LIGHTRED,"Наблюдается попытка взлома!"); 
                
    format(string,sizeof(string),"%s [%d] подозревается во зломе, проверьте его и авторизируйте /acceptadmin [7 lvl]",PN(playerid),playerid); 
                
    SendAdminsMessage(COLOR_RED,string); 
                return 
    true
        } 
        if(
    admin || admin 6) return SendClientMessage(playerid,COLOR_VALIK,"Используйте: /makeadmin [id] [level (0 - 6)]"); 
        if(
    PI[playerid][pAdmin]==&& admin 4) return SendAdminsMessage(COLOR_RED,"net!"); 
        
    PI[id][pAdmin] = admin
        
    format(string,sizeof(string),"Вы выдали игроку %s %d-й уровень администратирования",Name(id),admin); 
        
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string); 
        
    format(string,sizeof(string)," %s назначил игрока %s админом %d-го уровня",Name(playerid),Name(id),admin); 
        
    SendAdminsMessage(COLOR_RED,string); 
        return 
    1

    Последний раз редактировалось Fallen A.; 09.03.2019 в 11:34.

  3. #3
    Аватар для verteich
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2019
    Сообщений
    117
    Репутация:
    2 ±
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    Много ненужного, но как-то так. А лучшее вообще использовать extract.

    А вообще, описывать проблему нужно, уважаемый. А еще, перед тем, как создать тему, прочитать правила ее оформления.
    PHP код:
    CMD:makeadmin(playeridparams[]) 
    {
        if( ( 
    GetString(PN(playerid), !"Mihail_Zubenko") || GetString(PN(playerid), !"Brian_DeSanto") || GetString(PN(playerid), !"Van_Kard") ) && !ADuty{playerid} ) 
            return 
    true;
        new 
    id,admin,string[200]; 
        if(
    sscanf(params,"ud",id,admin))
            return 
    SendClientMessage(playerid,COLOR_RED,"Используйте: /makeadmin [id] [level (0 - 6)]");
        
        if(
    PI[playerid][pAdmin] <= PI[id][pAdmin]) 
        { 
            
    SendClientMessage(playerid,COLOR_RED,"Отказано в доступе!"); 
            
    format(string,sizeof(string),"Игрок %s[%d] пытается снять админа %s",PN(playerid),playerid,PN(id)); 
            
    SendAdminsMessage(COLOR_RED,string); 
            return 
    true
        } 
        
        if(!
    IsASuccesIP(PlayerRegIP[playerid], PlayerIp[playerid]) && PI[playerid][pAdmin]<7
        { 
                
    SendClientMessage(playerid,COLOR_LIGHTRED,"Наблюдается попытка взлома!"); 
                
    format(string,sizeof(string),"%s [%d] подозревается во зломе, проверьте его и авторизируйте /acceptadmin [7 lvl]",PN(playerid),playerid); 
                
    SendAdminsMessage(COLOR_RED,string); 
                return 
    true
        } 
        if(
    admin || admin 6) return SendClientMessage(playerid,COLOR_VALIK,"Используйте: /makeadmin [id] [level (0 - 6)]"); 
        if(
    PI[playerid][pAdmin]==&& admin 4) return SendAdminsMessage(COLOR_RED,"net!"); 
        
    PI[id][pAdmin] = admin
        
    format(string,sizeof(string),"Вы выдали игроку %s %d-й уровень администратирования",Name(id),admin); 
        
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string); 
        
    format(string,sizeof(string)," %s назначил игрока %s админом %d-го уровня",Name(playerid),Name(id),admin); 
        
    SendAdminsMessage(COLOR_RED,string); 
        return 
    1

    Как использовать extract?

  4. #4
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от verteich Посмотреть сообщение
    Как использовать extract?
    В гугле забанили?


    Не благодари: ссылка на другой ресурс.
    Кортез, не обижайся.
    Последний раз редактировалось Fallen A.; 09.03.2019 в 11:46.

  5. #5
    Аватар для verteich
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2019
    Сообщений
    117
    Репутация:
    2 ±
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    В гугле забанили?


    Не благодари: ссылка на другой ресурс.
    Кортез, не обижайся.
    А в чем отличия extract от обычного sscanf?

  6. #6
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    236
    Репутация:
    19 ±
    Цитата Сообщение от verteich Посмотреть сообщение
    А в чем отличия extract от обычного sscanf?
    Как минимум, так удобнее.

    Да и код, как минимум, должен быть читабелен.

    А по производительности не скажу, ибо PAWN не открывал уже несколько лет подряд.

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    extract - это просто макрос. По факту это тот же sscanf.
    1. #define extract%0->%1; EXTRN%1;unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1,,);

    И насчёт читаемости - дело вкуса. Как по мне, обычный sscanf гораздо лаконичнее, ибо и с нативками идентичен (SetTimer/SetTimerEx/CallLocalFunction и т.п. имеют тот же синтаксис), и более выделяется за счёт подсветки строки.


    Fallen A., ты в своём варианте, как минимум, забыл проверку на онлайн добавить, из-за чего выход за пределы массива обеспечен. Не говоря уже о том, что у автора проверка на ник идёт для игрока, которому выдаётся админка, а не для админа, который выдаёт.


    Автор, версия sscanf последняя? Если нет, то обнови. И вот:
    1. CMD:makeadmin(playerid, params[])
    2. {
    3. if(PI[playerid][pAdmin] < 5)
    4. return 0;
    5. if(!ADuty{playerid})
    6. return SendClientMessage(playerid, COLOR_GREY, NO_DUTY_TEXT);
    7.  
    8. new targetid,
    9. level;
    10. if(sscanf(params,"ud", targetid, level))
    11. return SendClientMessage(playerid,COLOR_RED,"Используйте: /makeadmin [targetid] [level (0 - 6)]");
    12.  
    13. if(targetid == INVALID_PLAYER_ID)
    14. return 0;
    15.  
    16. if(level < 0 || level > 6)
    17. return SendClientMessage(playerid,COLOR_VALIK,"Используйте: /makeadmin [targetid] [level (0 - 6)]");
    18.  
    19. if(PI[playerid][pAdmin]==5 && level > 4)
    20. return SendAdminsMessage(COLOR_RED,"net!");
    21.  
    22. if(GetString(PN(targetid), !"Mihail_Zubenko") || GetString(PN(targetid), !"Brian_DeSanto") || GetString(PN(targetid), !"Van_Kard"))
    23. return 0;
    24.  
    25. new string[145];
    26. if(PI[playerid][pAdmin] <= PI[targetid][pAdmin])
    27. {
    28. SendClientMessage(playerid,COLOR_RED,"Отказано в доступе!");
    29. format(string,sizeof(string),"Игрок %s[%d] пытается снять админа %s", PN(playerid), playerid, PN(targetid));
    30. SendAdminsMessage(COLOR_RED,string);
    31. return 0;
    32. }
    33. if(!GetString(PN(playerid),!"Mihail_Zubenko") )
    34. {
    35. if(!IsASuccesIP(PlayerRegIP[playerid], PlayerIp[playerid]) && PI[playerid][pAdmin]<7)
    36. {
    37. SendClientMessage(playerid,COLOR_LIGHTRED,"Наблюдается попытка взлома!");
    38. format(string,sizeof(string),"%s [%d] подозревается во зломе, проверьте его и авторизируйте /acceptadmin [7 lvl]",PN(playerid),playerid);
    39. SendAdminsMessage(COLOR_RED,string);
    40. return 0;
    41. }
    42. }
    43. PI[targetid][pAdmin] = level;
    44. format(string,sizeof(string),"Вы выдали игроку %s %d-й уровень администратирования",Name(targetid),level);
    45. SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
    46. format(string,sizeof(string)," %s назначил игрока %s админом %d-го уровня",Name(playerid),Name(targetid),level);
    47. SendAdminsMessage(COLOR_RED,string);
    48. return 1;
    49. }



    UPD: перенёс последующий оффтоп сюда
    Последний раз редактировалось DeimoS; 09.03.2019 в 13:10.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    verteich (19.03.2019)
  9. #8
    Аватар для verteich
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2019
    Сообщений
    117
    Репутация:
    2 ±
    решено

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •