• Как, зная только имя и email человека, злоумышленники получили доступ ко всем его аккаунтам и удаленно уничтожили информацию на всех его устройствах

      Очень интересная статья появилась сегодня на wired.com. Буквально за один час у автора статьи Мэта Хонана были взломаны Amazon, GMail, Apple и Twitter аккаунты и была удаленно уничтожена информация на его iPad, iPhone и MacBook. Среди прочего он потерял все фотографии своей дочки с ее рождения, многие документы и большую часть переписки. Очень интересно в этой истории то, как злоумышленник получил доступ к Amazon аккаунту и AppleID — для этого не понадобилась ничего, кроме доступной в сети информации и телефона.
      Читать дальше →
    • Несколько интересных особенностей MySQL

        В не очень далеком прошлом мне пришлось покопаться немного в исходном коде MySQL, и разобраться в некоторых аспектах его работы. В ходе работы лопаткой, и эксперимeнтов, я наткнулся на несколько очень интересных особенностей, часть из которых просто забавна, а в случае некоторых бывает очень интересно понять, чем руководствовался программист, который принимал решение сделать именно так.

        Начнем с такого интересного типа, как ENUM.

        mysql> CREATE TABLE enums(a ENUM('c', 'a', 'b'), b INT, KEY(a));
        Query OK, 0 rows affected (0.36 sec)
        
        mysql> INSERT INTO enums VALUES('a', 1), ('b', 1), ('c', 1);
        Query OK, 3 rows affected (0.05 sec)
        Records: 3  Duplicates: 0  Warnings: 0
        


        Итак, у нас есть таблица, в ней есть два столбца. У первого, a, тип ENUM, у второго, b, INT. В таблице три строки, у всех трех значение b равно 1. Интересно, чему равны минимальный и максимальный элементы в столбце a?

        mysql> SELECT MIN(a), MAX(a) FROM enums;
        +--------+--------+
        | MIN(a) | MAX(a) |
        +--------+--------+
        | c      | b      |
        +--------+--------+
        1 row in set (0.00 sec)
        


        Кажется странным, было бы разумно, если бы самым маленьким был 'a', а самым большим — 'c'.
        А что если выбрать минимум и максимум только среди тех строк, где b = 1? То есть, среди всех строк?

        mysql> SELECT MIN(a), MAX(a) FROM enums WHERE b = 1;
        +--------+--------+
        | MIN(a) | MAX(a) |
        +--------+--------+
        | a      | c      |
        +--------+--------+
        1 row in set (0.00 sec)
        


        Вот так мы заставили MySQL поменять свое мнение о том, как сравнивать поля в ENUM, просто добавив предикат.
        Разгадка такого поведения заключается в том, что в первом случае MySQL использует индекс, а во втором нет. Это, конечно, не объясняет, почему MySQL сравнивает ENUMы по разному для сортировки в индексе, и при обычном сравнении.

        Второй пример проще и лаконичнее:

        mysql> (SELECT * FROM moo LIMIT 1) LIMIT 2;
        +------+
        | a    |
        +------+
        |    1 |
        |    2 |
        +------+
        2 rows in set (0.00 sec)
        


        Когда я показал этот запрос своему коллеге, который занимается разработкой парсера SQL, его вопрос был не «почему этот запрос возвращает две строки», а «как надо написать SQL парсер так, чтобы такой запрос был валидным, без того, чтобы написать правило, специально разрешающее такой запрос».

        Интересно, что далеко не любой SELECT в скобках сработает, в частности, UNION в скобках — это синтаксическая ошибка:

        mysql> (SELECT * FROM moo UNION ALL SELECT * FROM hru) LIMIT 2;
        ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ALL SELECT * FROM hru) LIMIT 2' at line 1
        


        Еще несколько интересных примеров под катом
        Читать дальше →