[Library] ModernPDO

StulE

Новичок
Какие проблемы?

Какие конкретно символы?

какие и зачем?

Не пробовали задуматься?

Ваша проблема в том, что вы все это воспринимаете абстрактно. "ну есть какие-то инъекции, которые происходят через какие-то символы, которые экранирует какая-то функция".
При этом вы даже близко не понимаете, что такое инъекция. И для чего нужно это самое экранирование.
А туда же - писать гениальные врапперы для ПДО.

Инъекции получаются не из-за "спецсимволов". А путем выхода за границы грамматического литерала. Если у литерала нет ограничителей, как у числа например, или незакавыченного идентификатора, то вообще лафа - заходи кто хочешь, бери что хочешь.
Если ограничители есть, как у классического мальчика Бобби Тэйблс, но при этом эти ограничители не экранируются, то достаточно всего лишь закрыть литерал самому, и снова гулять свободно.

Отсюда становится понятно назначение экранирования. А оно примитивно до дебилизма: функция экранирования экранирует ограничители литерала. Те самые "не те кавычки". Не какие-то мифические "спецсимволы", а всего лишь те самые кавычки, которые служат границами строки. Тупо чтобы не перепутать с этой самой границей. Ну и заодно и сам экранирующий символ. Вы же сами это и делаете для идентификаторов.
Из чего следует вывод, что отрывать кавычки у quote() - это высшая степень дебилизма. Без кавычек она попросту не имеет смысла, ни малейшего. Вся суть этой функции в том, что она добавляет кавычки, в отличие от дебильной mysql_escape_string.
Еще там правда экранируется нулевой байт, но мне кажется, что современный софт уже не ломается через него. В крайнем случае можно руками.

В итоге всё это означает, что применять quote() для чего-то кроме строк - чуть более, чем бессмысленно. А поскольку строки у вас и так передаются через подготовленные выражения, то эта функция вообще не нужна.
Понял, огромное спасибо за разъяснение
 

Фанат

oncle terrible
Команда форума
Еще конечно удручает ученический код, все эти бессмысленные проверки и повторы.
почему нельзя написать что-то вроде
PHP:
    function identifier(string $name): string
    {
        $name = str_replace(self::QUOTE, self::QUOTE.self::QUOTE, $name);
        return self::QUOTE . $name . self::QUOTE;
    }

    function table(string $name): string
    {
        foreach (explode(self::DELIMITER, $name) as $key => $piece) {
            $pieces[$key] = self::identifier($piece);
        }
        return implode(self::DELIMITER, $pieces);
    }

    function column(string $name): string
    {
        return $this->table($name);
    }
Хотя он конечно тоже облажается на идентификаторе с точкой, но сейчас речь не об этом, а о коде.
 

StulE

Новичок
Еще конечно удручает ученический код, все эти бессмысленные проверки и повторы.
почему нельзя написать что-то вроде
PHP:
    function identifier(string $name): string
    {
        $name = str_replace(self::QUOTE, self::QUOTE.self::QUOTE, $name);
        return self::QUOTE . $name . self::QUOTE;
    }

    function table(string $name): string
    {
        foreach (explode(self::DELIMITER, $name) as $key => $piece) {
            $pieces[$key] = self::identifier($piece);
        }
        return implode(self::DELIMITER, $pieces);
    }

    function column(string $name): string
    {
        return $this->table($name);
    }
Хотя он конечно тоже облажается на идентификаторе с точкой, но сейчас речь не об этом, а о коде.
Исправлю в следующей версии
 
Сверху