Доклад "Распространённые заблуждения"

Фанат

oncle terrible
Команда форума
MySql
- искейпинг нужен для входящих данных
- искейпинг делает "вредные" символы "безопасными".
- искейпинг вообще имеет какое-то отношение к защите от инъекций.
- вообще какая бы то ни было работа с входящими данными имеет отношение к инъекциям.
- что mysql_real_escape_string "принимает во внимание текущую кодировку". и поэтому она лучше, чем addslashes()
- что подготовленные выражения - защита от всего, silver bullet
- что подготовленные выражения "быстрее".
- что при использовании подготовленных выражений искейпингом занимается база
если это родные подготовленные выражения, которыми занимается база, то никакой искейпинг тут не нужен - суть подготовленных выражений в том, что данные попадают в неё отдельно от запроса и поэтому искейпить ничего не надо.
- "Я использую PDO и вообще не думаю об инъекциях - база делает всё сама"
Как выяснилось, PDO лишь эмулирует [родные] препареды, в припадке поддержания обратной совместимости, видимо. И нормально формирует внутри себя обычный SQL, выполняя его без всяких prepare/execute. Становясь, как следствие, подверженной классической атаке на экзотическую кодировку GBK. Практического смысла в этой информации ноль, но для красного словца вполне годится.
В общем, PDO_EMULATE_PREPARES надо в сразу ставить в FALSE, а кодировку задавать в DSN-е.
- "Я использую ORM и работаю с объектами, а SQL в глаза не вижу"
Ну, вот это как раз из провокационных заявлений.
Сводится к тому, что на всякий хитрый ORM всегда найдётся запрос с винтом, который будет просто невозможно написать средствами ORM-a. То есть, имеется в виду, что совсем от SQL сбежать невозможно, и поэтому его надо знать, в том числе - и безопасность.
В принципе, это отличная стратегия: для простых запросов - простой ORM, а для сложных - SQL. Без крайностев. Впрочем, такой подход всё равно везде применяется. Вопрос в отношении - мы делаем SQL осмысленно, а не в виде неприятного исключения из нашего красивого ORMа
Ошибки
- самое главное заблуждение - подмена обработки ошибки обработкой сообщения об ошибке.
Ну, имеется в виду, что мы заткнули ошибку собакой и забыли о ней. или еще вот error_reporting(0) практикуется частенько, как универсальное средство борьбы с ошибками.
- Когда избавляются от сообщения, но не избавляются от ошибки.
- что собака давит только одну ошибку, которую мы ждём!!!
Шаблоны
- Шаблон - это "дизайн" сайта, а остальное по-старинке
- Шаблоны нужны "дизайнеру", чтобы он мог их править, не разбираясь в PHP.
- Следовательно, шаблоны служат для отделения PHP от HTML.
- в блочном шаблоне нет логики
Разное.
- оптимизация заключается в использовании более быстрых функций
- xff как ip адрес
Смешное
- кавычки относятся к синтаксису операторов (Echo, ключи массива, аргументам функций), а не являются ограничителями строк
В сущности, это только наброски, и детально проработана только mysql часть.
Никакую америку этот список не открывает, но здесь просто собраты самые распространённые заблуждения, с которыми приходится сталкиваться на форумах.
Некоторые из них особенно живучи, поскольку, будучи заученными бездумно во времена блаженного нубства, так и остались в памяти, как аксиомы.
 

Redjik

Джедай-мастер
Наглость с моей стороны, а где доклад? =)
Я понял, что теперь гугл в руки и пахать, но все же ...
 

Фанат

oncle terrible
Команда форума
Да ладно, что там такого особенно противоречащего твоим представлениям? :)
Некоторые высказывания, кстати, довольно провокационные, и несут исключительно оправдательную функцию - объяснить, почему вообще столько внимания уделено SQL вообще (во времена Active REcord/ORMs) и искейпингу в частности (во времена препаредов).
Впрочем, вот пара вопросов уже поступила - щас отвечу. Прям там, наверное
 

baev

‹°°¬•
Команда форума
Фанат, вроде, есть уже устоявшийся термин «экранирование», зачем этот «искейпинг»?
 

Redjik

Джедай-мастер
Подпункты по ошибкам,шаблонам,разному согласен, но моя святая уверенность в
- "Я использую PDO и вообще не думаю об инъекциях - база делает всё сама"
- "Я использую ORM и работаю с объектами, а SQL в глаза не вижу"
ставит в тупик, хотя PDO делает тот же prepared
 

Фанат

oncle terrible
Команда форума
baev
черт его знает. возможно - влияние англоязычной среды стаковерфлоя, в которой я последнее время подвизаюсь. надо бы переучиться. искейпинг, кстати, раза в полтора короче :)

Иван Redjik Матвеев
Ну, про второе я уже выше ответил, а про первое щас напишу.
 

zerkms

TDD infected
Команда форума
англоязычной среды стаковерфлоя, в которой я последнее время подвизаюсь
почётный нарушитель покоя обычно размеренного и спокойного коммунити )))
 

Фанат

oncle terrible
Команда форума
пардон, с
- самое главное заблуждение - подмена обработки ошибки обработкой сообщения об ошибке.
я что-то туплю.
в текущей редакции оно дублирует следующий пункт, а что я имел в виду, когда писал - уже не помню.
В любом случае эта часть базируется на http://phpfaq.ru/debug2, надо её просто проработать
 

Redjik

Джедай-мастер
Как выяснилось, PDO лишь эмулирует [родные] препареды, в припадке поддержания обратной совместимости, видимо. И нормально формирует внутри себя обычный SQL, выполняя его без всяких prepare/execute. Становясь, как следствие, подверженной классической атаке на экзотическую кодировку GBK. Практического смысла в этой информации ноль, но для красного словца вполне годится.
В общем, PDO_EMULATE_PREPARES надо в сразу ставить в FALSE, а кодировку задавать в DSN-е.
Это не знал, очень полезно.
А в целом, по ошибкам, вроде все известно, но иногда даже не задумываешься, что слова могут по-разному интерпретироваться.
на всякий хитрый ORM всегда найдётся запрос с винтом, который будет просто невозможно написать средствами ORM-a.
Вот по этой ошибке - да так оно и есть, но я мне, например, в голову не приходит упомянуть это, хотя случай чистого SQL не редок в моей практике.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Про ОРМ есть другая хорошая поговорка, что ОРМ позволяет простые вещи делать сложно, а сложные — не позволяет делать вообще.
 

Absinthe

жожо
флоппик простые вещи с ормом просто делаются. Что может быть проще Article.objects.filter(author='Puplkin)?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
флоппик простые вещи с ормом просто делаются. Что может быть проще ?
SELECT * FROM authors, articles WHERE articles.author_id = authors.id AND authors.name = 'Pupkin' ?

А сколько кода надо написать, что бы выполнить привязку авторов к статьям? А сколько запросов выполнится? А с учетом получения метаданных о этих таблицах? А если я хочу полнотекстовый индекс по статье использовать? А если надо индекс зафорсить?
 

Redjik

Джедай-мастер
SELECT * FROM authors, articles WHERE articles.author_id = authors.id AND authors.name = 'Pupkin' ?

А сколько кода надо написать, что бы выполнить привязку авторов к статьям? А сколько запросов выполнится? А с учетом получения метаданных о этих таблицах? А если я хочу полнотекстовый индекс по статье использовать? А если надо индекс зафорсить?
в таких случаях, при условии, что запрос может понадобиться больеш чем в 1-2х местах, я дописываю в ORM нужные мне методы.

+ из-за ORM код становиться лучше читаем, чем чистый SQL
 

флоппик

promotor fidei
Команда форума
Партнер клуба
в таких случаях, при условии, что запрос может понадобиться больеш чем в 1-2х местах, я дописываю в ORM нужные мне методы.
То есть, ты меняешь одну строчку типа db::FetchAll(SELECT * FROM authors, articles WHERE articles.author_id = authors.id AND authors.name = ?', 'Pupkin' );
на десяток строк php кода в орм-е и считаешь это «простым»?
 

Redjik

Джедай-мастер
То есть, ты меняешь одну строчку типа db::FetchAll(SELECT * FROM authors, articles WHERE articles.author_id = authors.id AND authors.name = ?', 'Pupkin' );
на десяток строк php кода в орм-е и считаешь это «простым»?
вытаскивание информации такого типа дефолтно пристутствует в любом маломальском ОРМ, тут больше вопрос об адекватности и времязатратности... говорю же, если что-то необычное появляется, и беглый взгляд на проэкт показывает, что это может понадобиться еще пару раз, то почему бы и не написать...
 

Sufir

Я не волшебник, я только учусь
[offtop]
Может не слишком интересный холивар по поводу ORM vs SQL отрезать от интереснейшей темы?
[/offtop]
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
> PDO лишь эмулирует [родные] препареды, в припадке поддержания обратной совместимости, видимо
просто нативные PS работают в mysql заметно медленнее, чем их эмуляция (проверял на 5.1)
 
Сверху