1.2, Ordu (ok), 23:17, 28/03/2019 [ответить] [﹢﹢﹢] [ · · · ]
| –3 +/– |
> Наиболее опасная проблема позволяет добиться подстановки своего SQL-кода через отправку специального запроса
Шёл 2019 год, а php всё не мог справиться с sql-injection. Блин, КАК ТАК МОЖНО?
Не, ну ладно C и C++ продолжают десятилетиями ходить по граблям нулевых и висящих указателей, там особенности языка вынуждают. Но sql -- это внешняя сущность для php, и всё что надо -- дать веб-макаке safe-API, который не позволит ей создать условий для sql-инъекции.
| |
|
2.3, Crazy Alex (ok), 23:45, 28/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Попытайтесь. И удивитесь, как много странных случаев, которые в красивые ограничения не укладываются - разного рода генерация имён таблиц на лету и тому подобное. Если проект крупнее hello world - никуда не денетесь, будете время от времени собирать запрос строкой, со всеми вытекающими рисками.
В плюсах, кстати, тоже можно в 99% случаев обойтись без каких-либо "граблей нулевых и висящих указателей", тем они от C и отличаются.
| |
|
|
4.7, Аноним (7), 01:07, 29/03/2019 [^] [^^] [^^^] [ответить]
| –1 +/– |
Нет, нельзя. В SQLite, например, нельзя создавать таблицы и триггерить прагмы используя prepared statements.
| |
|
5.31, vedronim (?), 09:48, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Нет, нельзя. В SQLite, например, нельзя создавать таблицы и триггерить прагмы используя
> prepared statements.
Скклайт это крайний случай. На нем е-коммерцию нормальные люди не делают. Уже в майскуеле все делается без проблем.
| |
|
4.25, Онаним (?), 08:43, 29/03/2019 [^] [^^] [^^^] [ответить]
| –2 +/– |
Два золотых правила, забывая которые, получают все эти грабли:
1) Весь - повторюсь - ВЕСЬ user input считается untrusted и при необходимости внутреннего использования - 100% валидируется в обязательном порядке, при любых условиях, даже если это увеличит объём и сложность кода в разы
2) При передаче каких либо untrusted данных в среду, использующую специальные символы в наборе данных, в обязательном порядке делаем полноценный escape согласно требованиям среды
| |
|
3.8, Ordu (ok), 01:08, 29/03/2019 [^] [^^] [^^^] [ответить]
| –2 +/– |
> Попытайтесь. И удивитесь, как много странных случаев, которые в красивые ограничения не
> укладываются - разного рода генерация имён таблиц на лету и тому
> подобное. Если проект крупнее hello world - никуда не денетесь, будете
> время от времени собирать запрос строкой, со всеми вытекающими рисками.
Это делается элементарно:
let field_name = get_one_more_field_name();
let result = query_builder()
.select(["uid", "nickname", field_name])
.from(USERS_TABLE)
.where(less(length("nickname"), 5))
.execute(SQL_CONNECTION);
Функции less и length, понятно, возвращают объекты, которые затем where компилирует в строчку. Или может не where, может стоит сначала собрать всё в один объект-запрос, проверив параллельно синтаксис, а затем всё за раз скомпилировать, чтобы не выделять память под строку с запросом, а непосредственно писать запрос в сокет sql.
Если напрягает то, что все эти "uid", "nickname" будут прогоняться через функцию экранирования каждый раз, дёргая каждый раз кучу и тормозя выполнение, то ничто не мешает объявить тип EscapedSqlString, который будет содержать в себе строку, а функция sql_escape_string, будет этот тип "разворачивать", возвращая строку изнутре не экранируя её, а обычный String она будет экранировать. Использование EscapedSqlString привносит возможностей скосячить, но так же оно привносит дополнительных трудностей, из-за чего самый простой способ использовать EscapedSqlString это:
const UID = EscapedSqlString::new("uid");
const NICKNAME = EscapedSqlString::new("nickname");
и затем:
.select([UID, NICKNAME, field_name])
и
.where(less(length(NICKNAME), 5))
Конечно, если мы говорим об интерпретируемом языке, то подобный подход всё равно добавит тормозов, потому что придётся собирать временный объект, но добавит оно не особо, а вот создать sql-инъекцию можно будет разве что злоумышленно.
| |
|
4.10, vitalif (ok), 01:17, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
...и учить ещё один язык в дополнение к SQL. А потом ой а как написать OR? Ой а как написать постгрес специфичный оператор? Ой а как вместо таблицы подзапрос? Ой а CTE написать?
Я лично вообще не понимаю, как можно такие баги (возможность sql-инъекции) допускать на любом языке. Рукожопу и Rust не помеха
| |
|
5.11, Ordu (ok), 01:33, 29/03/2019 [^] [^^] [^^^] [ответить]
| –1 +/– |
> ...и учить ещё один язык в дополнение к SQL.
Это и есть sql. Тут ничего учить дополнительно не надо, достаточно понять идею, как синтаксис sql транслируется в это.
> А потом ой а как написать OR? Ой а как написать постгрес специфичный оператор? Ой а как вместо таблицы подзапрос? Ой а CTE написать?
Для того, чтобы таких вопросов не возникало, библиотека для создания sql запросов должна хоститься на github'е, чтобы её разработка велась бы несколькими заинтересованными разработчиками, и постоянно бы туда влетали бы feature и pull реквесты. Через полгода она будет уметь всё, что надо. Ещё через полгода-год, она стабилизируется.
> Я лично вообще не понимаю, как можно такие баги (возможность sql-инъекции) допускать
> на любом языке.
Это потому, что, видимо, нет опыта долгосрочной поддержки программ с параллельным их развитием.
> Рукожопу и Rust не помеха
Да. Как показывает опыт применения miri на std из rust'а, не проблема: https://github.com/rust-lang/miri#bugs-found-by-miri
Если тебе слова в тех багах мало что говорят, то я поясню, что последние четыре -- это прямые нарушения rust'овых инвариантов, которые можно использовать для того, чтобы получить, как минимум, data race. А в некоторых, случаях, возможно даже use after free или типа того. Точнее не скажу, что именно можно -- это надо смотреть описание багов.
Но здесь ты совершаешь очень распространённую ошибку. Если мы не можем решить проблему на 100%, это не повод отказываться от того, чтобы решить её на 90%. Проблема решённая на 90% лучше, чем проблема решённая на 0%.
| |
|
6.15, Crazy Alex (ok), 02:58, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Да блин, ормов сотоварищи написано уже море. Но используются в основном какой-нибудь джаве, где написать простыню (и ещё кусок xml впридачу) для выполнения чего-то тривиального - норма, как в том же Hibernate. И то вписанные руками SQL запросы - не то чтобы редкость. Потому что по дефолту либо с быстродействием проблемы, либо что-то требует больше динамики, чем может предоставить либа.
| |
|
7.16, Ordu (ok), 04:16, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Да блин, ормов сотоварищи написано уже море. Но используются в основном какой-нибудь
> джаве, где написать простыню (и ещё кусок xml впридачу) для выполнения
> чего-то тривиального - норма, как в том же Hibernate. И то
> вписанные руками SQL запросы - не то чтобы редкость. Потому что
> по дефолту либо с быстродействием проблемы, либо что-то требует больше динамики,
> чем может предоставить либа.
То что я предложил выше -- это не ORM. Не надо путать тёплое с мягким.
| |
|
8.26, Онаним (?), 08:47, 29/03/2019 [^] [^^] [^^^] [ответить] | +1 +/– | Ну делал я себе такой генератор запросов ради эксперимента Выкинул 1 Неудобно... текст свёрнут, показать | |
|
9.39, Аноним (39), 12:09, 29/03/2019 [^] [^^] [^^^] [ответить] | –2 +/– | Не, мужики, вы опять двинулись не в ту сторону Вместо того, чтобы мечтать о как... текст свёрнут, показать | |
9.44, Ordu (ok), 13:25, 29/03/2019 [^] [^^] [^^^] [ответить] | +/– | А как ты мерял Я просто нашёл такую библиотеку для php, и мне аж любопытно стал... текст свёрнут, показать | |
|
|
|
6.48, Sw00p aka Jerom (?), 16:17, 29/03/2019 [^] [^^] [^^^] [ответить]
| –1 +/– |
>Проблема решённая на 90% лучше, чем проблема решённая на 0%.
кхммм, во-первых, проблемы разрешают, а не решают, решают - задачи. Во-вторых, по определению у проблемы на данный момент не должно быть разрешений, на то и проблема. В третьих, в вашем утверждении проблему нужно заменить на задачу.
пс: не сочтите за придирания к словам, но лучше на не использовать то понятие, которое знаете на 90%, "незнайка, лучше недоучки".
| |
|
7.54, Ordu (ok), 19:28, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
>>Проблема решённая на 90% лучше, чем проблема решённая на 0%.
> кхммм, во-первых, проблемы разрешают, а не решают, решают - задачи.
Давайте теперь устроим тут урок русского языка?
> Во-вторых, по
> определению у проблемы на данный момент не должно быть разрешений, на
> то и проблема. В третьих, в вашем утверждении проблему нужно заменить
> на задачу.
Как вам будет угодно.
> пс: не сочтите за придирания к словам, но лучше на не использовать
> то понятие, которое знаете на 90%, "незнайка, лучше недоучки".
🙄
| |
|
|
5.13, freehck (ok), 02:00, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Я лично вообще не понимаю, как можно такие баги (возможность sql-инъекции) допускать на любом языке.
Как-как. Надо спозиционировать язык как "язык для домохозяек", после чего нарастить соотвествующего уровня сознания комьюнити -- и вуаля, получите массу ошибок такого толка в тысячах проектов. =)
| |
|
4.12, freehck (ok), 01:57, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
> let result = query_builder()
> .select(["uid", "nickname", field_name])
> .from(USERS_TABLE)
> .where(less(length("nickname"), 5))
> .execute(SQL_CONNECTION);
Ну с селектом-то всё просто. Если уж показывать, то джойны, агрегаты, вложенные запросы. =)
| |
|
5.22, Ordu (ok), 05:04, 29/03/2019 [^] [^^] [^^^] [ответить] | +/– | Мне сложно навскидку предложить решение для php Там нужны ссылки на поля из раз... большой текст свёрнут, показать | |
|
6.27, Онаним (?), 08:53, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Ага. А теперь давай напишем
(
(SELECT a.x, (SELECT SUM(b.y) FROM b WHERE b.f IN (SELECT e.p FROM e)) AS c, CONCAT(a.z, a.abc) AS d INNER JOIN (SELECT g.h, g.j FROM g WHERE g.k = 1) AS l ON l.h = a.m)
UNION
(SELECT a.x, (SELECT SUM(b.y) FROM b WHERE b.f IN (SELECT e.p FROM e)) AS c, CONCAT(a.z, a.abc) AS d INNER JOIN (SELECT n.h, n.j FROM g WHERE g.k = 1) AS l ON l.h = a.m)
) LIMIT 50
Ну, ORDER, WHERE, GROUP и HAVING пропустил, можно ещё и там было побаловаться
| |
|
7.46, Ordu (ok), 13:50, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
>[оверквотинг удален]
> g.j FROM g WHERE g.k = 1) AS l ON l.h
> = a.m)
> UNION
> (SELECT a.x, (SELECT SUM(b.y) FROM b WHERE b.f IN (SELECT e.p FROM
> e)) AS c, CONCAT(a.z, a.abc) AS d INNER JOIN (SELECT n.h,
> n.j FROM g WHERE g.k = 1) AS l ON l.h
> = a.m)
> ) LIMIT 50
> Ну, ORDER, WHERE, GROUP и HAVING пропустил, можно ещё и там было
> побаловаться
Ты в курсе, что подзапросы можно собирать в переменные, делая таким образом этот код читабельнее?
| |
|
6.62, freehck (ok), 13:24, 30/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Да блин, хочешь я тебе сейчас прямо здесь напидаю простейшую реализацию?
А, так это не готовая реализация, это просто прожект? Сорри, я подумал, ты о какой-то уже существующей библиотеке говоришь.
Что мне накидывать, накидать-то я и сам могу. Но что ты хочешь от коммьюнити пхпшников, ну в самом деле... Это же пхпшники, ну камон.
Я помню, как я пытался одного пхпшника в проекте научить делать авторизацию через базу. Дал ему ссылки на все доки, все апи, вообще на всё. Без толку: он в итоге сделал худо-бедно по роликам на ютубе авторизацию посредством записи сессии в файл, и с чувством выполненного долга доложил о том, что справился. =/
И это, блин, всего лишь авторизация. А ты про правильные подходы к организации работы с базой.
Не, вебнику вебниково. Вся работа с базой должна быть вынесена в бэкенд, а вебнику предоставлены API работы с бэкендом. Это -- наиболее разумное решение, имхо. И не на php надо писать фронтенд, а на js. Jamstack не на пустом месте родился.
PS: и будем честны, вряд ли вебнику под силу писать запросы в базу сложнее селекта и апдейта значений одной конкретной таблицы.
| |
|
7.63, Ordu (ok), 23:39, 30/03/2019 [^] [^^] [^^^] [ответить] | +/– | Да, я из этого обсуждения уже понял Они мыслят в узких рамках создания конкретн... большой текст свёрнут, показать | |
|
|
|
4.14, Crazy Alex (ok), 02:22, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Это у вас статически построенный запрос. Для простых случаев - так и делают, благо ормов написано - вагон. А теперь представьте, что оно генерируется динамически - надо - лишнее where добавили (или в него пару-тройку условий), надо - join докрутили, имя таблицы на лету сгенерировали, и так далее. Ну, то есть тоже можно реализовать, но получаются такие монстры, с котороыми связываться - только проблем искать. А если проще - то не выйдет всё эскейпить, оптому что там натурально не только данные подставляются, но и куски языковой конструкции генерируются.
В общем, поверьте, SQL - это настолько истоптанная тема, что абсолютно все подходы были перепробованы сотни если не тысячи раз. И используется то, что даёт оптимальный выхлоп.
| |
|
5.17, Ordu (ok), 04:28, 29/03/2019 [^] [^^] [^^^] [ответить] | +/– | Динамически Методы типа select, where и прочие вызываются динамически Никто не... большой текст свёрнут, показать | |
|
6.29, Онаним (?), 08:58, 29/03/2019 [^] [^^] [^^^] [ответить]
| +3 +/– |
Да нет, ты не ошибался. Только это не к PHP'шникам, а как раз к любителям "классических" подходов в PHP.
40 файлов и 100 килобайт кода. Только чтобы собрать SQL-запрос не конкатенацией.
Ещё раз: 40 СРАНЫХ ФАЙЛОВ и 100 СРАНЫХ КИЛОБАЙТ КОДА. Ради сборки запроса. В языке с динамической загрузкой и предтрансляцией. А потом эти же люди удивляются, почему их криворукие поделия еле ворочаются даже на шустрых VPS.
| |
|
7.33, vedronim (?), 09:51, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Да нет, ты не ошибался. Только это не к PHP'шникам, а как
> раз к любителям "классических" подходов в PHP.
> 40 файлов и 100 килобайт кода. Только чтобы собрать SQL-запрос не конкатенацией.
> Ещё раз: 40 СРАНЫХ ФАЙЛОВ и 100 СРАНЫХ КИЛОБАЙТ КОДА. Ради сборки
> запроса. В языке с динамической загрузкой и предтрансляцией. А потом эти
> же люди удивляются, почему их криворукие поделия еле ворочаются даже на
> шустрых VPS.
Всеми руками за, бро!
| |
7.45, Ordu (ok), 13:27, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Да нет, ты не ошибался. Только это не к PHP'шникам, а как
> раз к любителям "классических" подходов в PHP.
> 40 файлов и 100 килобайт кода. Только чтобы собрать SQL-запрос не конкатенацией.
> Ещё раз: 40 СРАНЫХ ФАЙЛОВ и 100 СРАНЫХ КИЛОБАЙТ КОДА. Ради сборки
> запроса. В языке с динамической загрузкой и предтрансляцией. А потом эти
> же люди удивляются, почему их криворукие поделия еле ворочаются даже на
> шустрых VPS.
Хех. Ну тогда втoпку php, всё что я могу сказать.
| |
7.49, Sw00p aka Jerom (?), 16:21, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
>Ещё раз: 40 СРАНЫХ ФАЙЛОВ и 100 СРАНЫХ КИЛОБАЙТ КОДА. Ради сборки запроса.
простите, а у вашей ОРМ разве не столько файлов? или вы их своими не считаете?
| |
|
|
|
|
|
2.24, Онаним (?), 08:38, 29/03/2019 [^] [^^] [^^^] [ответить]
| +2 +/– |
Это вопрос элементарной аккуратности. Тут надо не тормознющие и ограниченные safe API плодить для раздолбаев, а банально вправлять руки/мозги джунам до просветления.
| |
|
3.43, Ordu (ok), 13:24, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Это вопрос элементарной аккуратности. Тут надо не тормознющие и ограниченные safe API
> плодить для раздолбаев, а банально вправлять руки/мозги джунам до просветления.
Да, точно. Вон C/C++ программеры до сих пор правят. И опыт Magento тоже показывает, что это работает. Да.
| |
|
2.28, конь в пальто (?), 08:55, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
тут не в php дело, а конкретно в маженте - эталонного примера некомпетентности разработчиков.
| |
|
3.50, Sw00p aka Jerom (?), 16:24, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> тут не в php дело, а конкретно в маженте - эталонного примера
> некомпетентности разработчиков.
ругать ЯП - последнее дело!
| |
|
2.47, _ (??), 14:46, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
Ну дык не истери, не плачь, не проси - а возьми И ДАЙ! Ты же типо умнее перечисленных в посте? Или такое же? 😉
| |
|
3.53, Ordu (ok), 19:25, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Ну дык не истери, не плачь, не проси - а возьми И
> ДАЙ! Ты же типо умнее перечисленных в посте? Или такое же?
> 😉
Так "возьми" или "дай"?
Я не понимаю, что ты имеешь в виду.
| |
|
|
1.4, zzz (??), 23:55, 28/03/2019 [ответить] [﹢﹢﹢] [ · · · ]
| –1 +/– |
Кто-то до сих пор пользуется этим раздутым маркетинговым буллшитом?
| |
|
|
|
4.59, tsifra (?), 23:45, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Мне правда очень интересно. Знаком с платформой с первой версии. Недавно внедрял версию 2.3. Негатива очень много. Но проверенные мной альтернативы не смогли дать нужную гибкость. В итоге костылями и скриптами пришлось доводить magento
| |
|
|
4.56, tsifra (?), 23:27, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Вы насколько хорошо с предметной областью знакомы? Рассчитывал получить коментарии от профи. На мой взгляд magento это никак не меньше чем фреймфорк symfony
| |
|
5.58, пох (?), 23:41, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
> Вы насколько хорошо с предметной областью знакомы?
когда вместо ответа дают ссылку на бессмысленные списки из викибредии - это означает, что подобным списком знакомство и исчерпывается.
> На мой взгляд magento это никак не меньше чем фреймфорк symfony
вообще-то они совершенно перпендикулярны.
мажента - готовый механизм для конкретной задачи. symphony - набор шестеренок, механизм надо собрать самостоятельно.
| |
|
6.60, tsifra (?), 23:56, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
Я оцениваю мадженту больше как каркас с готовой веб-витриной и всеми ништяками для seo и cms, который задаёт определённые правила и даёт определённые инструменты. В отрыве от каких-то других систем(вроде odoo/самописных) она неприменима даже для мало-мальски малого бизнеса. Точнее применима, но это боль. Отсюда и сравнение с symfony
| |
|
7.61, пох (?), 09:56, 30/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
механизм, да, не готовая машина. но время на сборку из шестеренок (часть из которых, традиционно, квадратные) все же экономит - хотя и ценой необходимости разобраться в уже собранном - но это все же быстрее, чем самому выпиливать надфилем.
минус - вот, за обновлениями надо следить, а самосбору может помочь эффект неуловимого джо, даже если в самой symphony тоже в очередной раз найдут дырку, или ты самостоятельно ее проделаешь.
впрочем, средства пассивной безопасности никто не отменял.
| |
|
|
|
|
|
|
|
2.32, Аноним (32), 09:48, 29/03/2019 [^] [^^] [^^^] [ответить]
| +1 +/– |
с этого и надо начинать было, по криворукости программеры абоба уступают только хп. ненужно.
| |
|
3.42, sin (??), 12:58, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
magento принадлежит адобу не более полугода, вряд ли они кого-то, кроме топов, успели поменять.
А так она каждые пару лет из рук в руки переходит
| |
|
|
|
|
3.35, нах (?), 10:34, 29/03/2019 [^] [^^] [^^^] [ответить]
| +/– |
только он пищал и портил текст, и не работал.
Ой, нет, простите, с vi перепутал - он даже не пищал, просто молча портил и не работал.
То есть был один разработчик, умевший код, совместимый с suhosin, его в парижской палате мер и весов показывают, под стеклянным колпаком. Производит эталонное ненужно.
| |
|
|
|