Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 9
    Гостей: 8
    Пользователи: - отсутствуют
    Роботы: Mail Ru

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 22-04-2012, 00:10 Просмотров: 3195

    SQL_QuoteString Функция экранирует одинарные кавычки в запросе

    Думаю нет смысла вам рассказывать, что все читеры только и ждут как бы найти новую дырку в безопасности вашего сервера, с помощью которой можно было бы отомстить и "сломать" сервер, по этому безопасность прежде всего, особенно если ники игроков попадают в базу данных или то, что игроки пишут в чат, так как это может привести к атакам с помощью SQL инъекций. Функция SQL_QuoteString призвана нам в этом помочь, она экранирует все одинарные кавычки, что не даст злоумышленнику изменить запрос к базе данных.

    Инфо из sql.inc:
    /**
    * Back-quotes characters in a string for database querying.
    * Note: The buffer's maximum size should be 2*strlen(string) to catch
    * all scenarios.
    *
    * @param db                Database handle, for localization.
    * @param buffer            Buffer to copy to.
    * @param buflen            Maximum size of the buffer.
    * @param string            String to backquote (should not overlap buffer).
    * @return                    Length of new string, or -1 on failure.
    */
    native SQL_QuoteString(Handle:db, buffer[], buflen, const string[]);


    Синтаксис:
    SQL_QuoteString(Handle:db, buffer[], buflen, const string[])

    • Handle:db - Идентификатор соединения с базой данных
    • buffer[] - Массив куда будет записан обработанный массив
    • buflen - Его длина
    • const string[] - Массив для обработки


    Тип функции:
    Native

    Пример:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>
    #include <sqlx>

    #define PLUGIN "[SQLx.inc] SQL_ThreadQuery"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new Handle:SQL_Tuple
    new Handle:g_SQL_Connection

    public plugin_init() {
        
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_cvar("SQLx_host","127.0.0.1")
        register_cvar("SQLx_db","amxxmodx")
        register_cvar("SQLx_user","admin")
        register_cvar("SQLx_password","pass")
        
    }
    public plugin_cfg(){
        new host[33],dbase[33],user[33],pass[33]
        get_cvar_string("SQLx_host",host,30)
        get_cvar_string("SQLx_db",dbase,30)
        get_cvar_string("SQLx_user",user,30)
        get_cvar_string("SQLx_password",pass,30)
        SQL_Tuple = SQL_MakeDbTuple(host,user,pass,dbase) // Создание картежа данных для соединения с БД
        
        new err, error[256]
        g_SQL_Connection = SQL_Connect(SQL_Tuple, err, error, charsmax(error))
        
        if(g_SQL_Connection != Empty_Handle)
        {
            log_amx("[sql ok]")
            }else{
            log_amx("[sql error] %s ",error)
            pause("a")
        }
        
        
        new name[32], unquoted_name[] = "Privet'amxxmodx"
        SQL_QuoteString(g_SQL_Connection , name, 31, unquoted_name)
            
        new query[256]    
        format(query,charsmax(query),"SELECT * FROM table WHERE `name` ='%s'",name)
        new data[2]
        data[0] = 44
        
        SQL_ThreadQuery(SQL_Tuple,"QueryHandler",query,data,charsmax(data))

    }
    public QueryHandler(FailState, Handle:Query, error[], err, data[], size, Float:querytime)
    {
        if(FailState != TQUERY_SUCCESS)
        {
            log_amx("sql error: %d (%s)", err, error)
            return
        }
        if( SQL_NumResults(Query) > 0 )
            server_print("Sql result [%d] data[%d]",SQL_NumResults(Query),data[0])
            
            
        new buffer[512]
        SQL_GetQueryString(Query,buffer,charsmax(buffer))
        server_print("[%s]",buffer)
            
    }
    public plugin_end(){

        SQL_FreeHandle(SQL_Tuple)
        SQL_FreeHandle(g_SQL_Connection)
        
    }


    Описание:
    Что бы показать вам что получится в результате работы функции, изучите сначала функцию SQL_GetQueryString, так как с помощью нее будем смотреть на результаты работы функции SQL_QuoteString.

    По большому счету нас интересует во всем примере только эти строки:
        new name[32], unquoted_name[] = "Privet'amxxmodx"
        SQL_QuoteString(g_SQL_Connection , name, 31, unquoted_name)
    Как видите есть пара массивов, в один из которых записано два слова, между которыми одна одинарная кавычка, если в запрос
    SELECT * FROM table WHERE `name` ='user_name'
    вставить такое имя:
    SELECT * FROM table WHERE `name` ='Privet'amxxmodx'
    То как видите будет изменен сам запрос, то есть после условия name появится слово amxxmodx, что испортит запрос.По этому и используется рассматриваемая функция.
    Результатом ее работы будет следующее:
    SELECT * FROM dle_users WHERE `name` ='Privet\'amxxmodx'
    Обратите внимание на это 'Privet\'medved' - одинарная кавычка была за экранирована слешем, что дает понять базе данных что это не формирование запроса(спец символ), а простой текст.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Наверх

Реклама