За последние 24 часа нас посетили 22928 программистов и 1237 роботов. Сейчас ищут 645 программистов ...

Трактование интерфейса PHP для SQL

Тема в разделе "PHP и базы данных", создана пользователем Full-R, 26 янв 2020.

  1. Full-R

    Full-R Зэк
    [ БАН ]

    С нами с:
    25 янв 2020
    Сообщения:
    6
    Симпатии:
    0
    Интерес следующий: выяснить, как реально работает механизм выполнения запросов MySQL на движке MySQLi.

    Я смог разобраться и на базе MySQLi расширения для PHP написать свой движек для БД MySQL, но у меня возникло множество вопросов про внутреннее устройство механизма транзакций.

    Например, MySQL real escape недокументирована и фильтрует только порядка 7ми последовательностей в модифицированной версии и при этом требует прямого установленного соединения с сервером БД. Это наверное подразумевает, что при подключении к серверу устанавливается кодировка для связи и она должна добавлять к фильтрам нужные для языков последовательности.

    Это мне проверить не удалось и я написал дополнительные функции проверки SQL, когда выяснил, что на Российских хостингах real_escape может быть отключен по некоторым причинам для некоторых пользователей:

    PHP:
    1.     // Cleanup inner SQL
    2.     protected static function innerEscape( string $v ): string {
    3.  
    4.         return mysqli_real_escape_string(
    5.  
    6.             self::$dbx_lnk[0],
    7.  
    8.             str_ireplace(
    9.  
    10.                 [' OR ', '||', ' AND ', '&&', ' ON ', "'", '--+', 'qq', '"', '--', '%'],
    11.  
    12.                 [' or ', ' || ', ' and ', ' && ', ' on ', '\'', ';', '', '"', '--', '%'],
    13.  
    14.                 addslashes(
    15.  
    16.                     htmlspecialchars($v)
    17.  
    18.                 )
    19.  
    20.             )
    21.  
    22.         );
    23.  
    24.     }
    Уязвимостей гораздо больше, чем видно и вы можете ислледовать шаги экранирования, понимая, что, например, OR 1 = 1 может быть представлено в запросе, как || 1 = 1 и это тоже уязвимость ...

    PHP:
    1.  
    2.   // Cleanup outer SQL
    3.   protected static function escapeOuter( string $s ): string {
    4.  
    5.   return preg_replace(
    6.  
    7.   ['/(\/\*\s*\w*\s*(?!.\/\*))/si', '/(\-\-\s*\w*\s*(?!.\-\-))/si', '/(or\s*\w*\s*=\s*\w(?!.*or)|\|\|\s*\w*\s*=\s*\w(?!.\|\|))/si', '/[\x{10000}-\x{10FFFF}]/u'],
    8.  
    9.   [';', ';', '', '\xEF\xBF\xBD'],
    10.  
    11.  
    12.   ['--+', '"', "\x1a", '%', 'qq ', '--'],
    13.  
    14.   [';', '"', '\\Z', "\%", '--'],
    15.  
    16.   trim($s),
    17.  
    18.   )
    19.  
    20.   );
    21.  
    22.   }
    В общем, PDO тут не спасет даже с подготовленными запросами.

    Предлагаю поделиться информацией на предмет: "как взломать MySQL".

    Есть также PDO, но нет большой разницы, а в производительности выигрывает расширение mySQLi.

    При написании своего движка БД я надеялся на auto commit, когда думал об защите от падения БД. У меня получилось создать статический кэш, который можно использовать без подключения для БД и брать данные их статики на JSON.

    Я думал, что он накапливает транзакцию а потом отправляет. Это оказалось не правда и работает это с ошибками так как savepoints недокументированы.

    Было решено делать накопление запросов в стек и объединить на UNION. Тогда при включении соединения с БД мы просто отправляем цеполчу SQL и БД становится актуальна, а данные при этом обновляем в самих статических кэшах.

    Я бы хотел у знающих спросить совета, как лучше это сделать. У нас есть ограничение PCRE, которое на позволяет брать xQuery из-за сложного парсинга. У меня сейчас есть JSON и я не пишу свою БД no SQL так как мне нравится SQL, а хочу написать опции замены строк дыннх для временной поддержки системы, когда БД недоступна или обновляется.

    Если ли какое-то подобное более менее готовое решение для JSON без сторонних библиотек?

    Например я храню таблицу {id:1, filed_test: 'probe some text'} и мене для id 0 надо заменить поле field_test. Строками я это умею даже без mb_string, но сейчас строковых программистов не найти, чтобы написать более грамотно.

    Можно было бы пользователям позволить писать и менять контент, удалять его без подключения к БД, а в последующем при включеннии сервера отправлять стек подготовленных SQL типа:

    1) . edit page
    2). add comment
    3). moderate -> publish
    4). reply

    и так далее.

    Я прикинул, что здесь auto index для инкремента не сломает систему, так как действия все равно последовательные. Главное обновить статическую копию данных.

    Есть ли идеи, как это лучше сделать? Redis и Rabit я не использу ...

    Также я нашел ряд проблем с RLIKE, LIKE и укороченными запросами из-за SQL уязвимостей и для своей системы оставид только RegExp. Хтелось бы расширить API всякими поисками по дате или фильтрами типов, как в Angular. Приму сылки на информацию по теме.

    Когда нибудь я напишу расширения для PHP и опубликую вне своего framework ... Сейчас это не доконца реализовано, а идей много.
     
    #1 Full-R, 26 янв 2020
    Последнее редактирование: 26 янв 2020
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    создай тест код, где наглядно демонстрируется уязвимость. Вдупляться в это все не моветон.
     
  3. Full-R

    Full-R Зэк
    [ БАН ]

    С нами с:
    25 янв 2020
    Сообщения:
    6
    Симпатии:
    0
    Тесты для ленивых я не пишу так же, как и не обязан давать ни чего готового, читая про моветон с неподдельной ноткой неприязни.
    Если хотите быть умнее, лучше понимать и получать больше за это - возьмите командную строку и проверьте ...

    Свой UNIT можете подставить людям, которые сами же не понимают, как работает код, который они используют, а также людям, которые располагают чужими деньгами для людей, которые не понимают, как этот код работает.

    Я лишь в будущем могу как-то это предотвратить на уровне системы, но, в данный момент это не получается.

    escapeOuter - весь SQL;
    innerEscape - некоторые сегменты, например, внутри значений = '' и других частях.

    p.s. может тебе еще выложить автоинжектор готовый, чтобы другие script kiddie выглядели аки хацкеры?

    p.s.: rotopidoren not a federal.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    wtf ?

    Ясно пациент.
    2020-01-26_14-12-04.png
     
    miketomlin нравится это.
  5. Full-R

    Full-R Зэк
    [ БАН ]

    С нами с:
    25 янв 2020
    Сообщения:
    6
    Симпатии:
    0
    Я с этими людьми, которые ставят диагнозы типа "пациент" по почерку на форуме(не перепутай психиатров с бесполезными для программистов хирургами), как бы разработчик в прошлом и они меня хорошо знают.

    А ты, теперь, пойди и усвой все три стиля "айкидо" по MySQL от процедурного и функционально до смешанного, когда сможешь сджойнить 5 таблиц с помощью INNER, где повторяются имена ячеек field_id и filed_date в таблицах, а данные в этих ячейках разные и они не схлопываются в результате запроса. Потом можете рассказывать зачем знать все три стиля, про важность UNIT тестов и их пользу для зарплаты.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    Что не покидает ощущения гугло-перевода... Либо автор типа учителя Йоды... "слов неважен для смысла порядок" ну и вообще сложно понять о чем пост.

    Типа он такой крутой - разбил впух и в прах стандартный MySQLi и PDO... Но примеров не покажет, никому ничего не скажет... Сами е.. сь типа?

    Какое то меряние пиписьками по сложному запросу SQL, хотя не факт что он сложный.

    Многие вещи непонятны вовсе - типа написание Кеша дополнительного к бд, да ещё и хранение всего этого в json файлах

    Главный вопрос - что автор хотел спросить на форуме, или просто рассказать о своём супер супер проекте решил?
     
    miketomlin нравится это.
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    тот факт что ты пропеллериваешь пропаганду детского сада, выбешивает еще больше. Просто иди наxуй обратно в 4 стенки.
     
  8. Full-R

    Full-R Зэк
    [ БАН ]

    С нами с:
    25 янв 2020
    Сообщения:
    6
    Симпатии:
    0
    Твои предки
    Я не соревнуюсь в крутости. Мне некогда.

    Твои предки уже измеряли аналом письки монголов и после этого стали татарами. Ты просто не забывай, что живешь в России, где доминируют Русские(сделать тебя Русским снова, отремонтировав генетику такой же писькой только белого человека не сложно, но мы по низкосортному говну не ездим и провокаторов не развиваем) ...

    Модераторов прошу ценную тему освободить от провокаторов и очистить заранее, чтобы люди, которые хотят и могут поучаствовать в улучшении будущих версий нашего любимого PHP могли писать свободно и принимать участие в этой теме форума.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Full-R, ты нормально объясни, чтобы тема была ценной ;) Пока что другие написали в теме более вменяемые вещи, чем ты.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    Неадекватное поведение тс достойно бана, хотя бы за разжигание межнациональной розни и переход на личности
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @ADSoft, поддержу. Этот абзац – просто «Абзац»!
    --- Добавлено ---
    Походу ТС только за этим и приходил. Тут «политических» немного приструнили. Решил поддать огоньку.
     
    #11 miketomlin, 26 янв 2020
    Последнее редактирование: 26 янв 2020