|
2.45, Аноним (45), 19:59, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
РЕПЛ — это в лиспах. Больше нигде не видел даже отдалённо напоминающего. Все попытки создать подобное в других языках выгдядят как детская поделка из пластилина и желудей, и имеет чуть большую полезность.
| |
|
|
|
3.44, Ustas (??), 19:12, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
А что не так - телячий язык под брусничным соусом это что-то…
| |
|
2.6, vdb (?), 00:23, 06/06/2025 [^] [^^] [^^^] [ответить]
| +5 +/– |
Во-первых, неправильная обработка '..' — это алгоритмическая, а не сишная проблема. Во-вторых, с каких пор питон стал нормальным языком?
| |
|
3.8, Аноним (8), 01:06, 06/06/2025 [^] [^^] [^^^] [ответить]
| –4 +/– |
>неправильная обработка '..' — это алгоритмическая, а не сишная проблема.
Только наполовину. Из-за примитивности си, в нём в качестве путей используются сырые строки, со всеми вытекающими проблемами.
https://ocaml.org/p/eio/1.2/doc/Eio/Stdenv/index.html#val-cwd
>Paths can be absolute or relative (to the current working directory). Using relative paths with this is similar to using them with cwd, except that this will follow ".." and symlinks to other parts of the filesystem.
Это значит, что вручную проверять каждый путь на правильность не нужно.
Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)
Данная строка выбросит исключение, так как происходит выход за допустимые границы.
| |
|
4.12, Аноним (12), 05:53, 06/06/2025 [^] [^^] [^^^] [ответить]
| +4 +/– |
Пути как строки принимает любая современная ОС, вы что-то пургу несёте какую-то. Обработать строку и убрать оттуда "/../" - дело максимум 20 строк в цикле.
| |
4.38, Аноним (-), 14:41, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)
С такими рунами остальное будет совершенно не важно ибо если проект девелопаете только вы - его проблемы только вам и интересны.
| |
|
5.43, Аноним (8), 19:08, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
>С такими рунами
Щито поделать, десу. Ну вот не завезли в мейнстрим ничего похожего.
| |
|
|
|
|
5.39, Аноним (12), 15:11, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
ООПшники, которые вместо написания полезного кода наклепали сотни тысяч обёрток вокруг кода, который реально что-то делает - стадо упрямое. Без этой секты инкапсуляции в школе можно было бы человека сразу на bash учить программировать - там заодно и проблем никаких с типами не было бы, всё есть строка и всё читает буквы.
| |
|
|
|
2.21, какая разница (?), 08:42, 06/06/2025 [^] [^^] [^^^] [ответить]
| +2 +/– |
> Уязвимости устранены в выпусках Python 3.13.4 и 3.12.11,
но местные "эксперты" по старой памяти во всем винили Си..
| |
|
1.7, Аноним (7), 00:36, 06/06/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +9 +/– |
> вызвана некорректной обработкой последовательности ".." в имени ссылки.
Старая грабля, но по прежнему исправно #%^шит по лбу всяким нубам.
| |
1.9, Аноним (12), 01:21, 06/06/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Так ведь это нормальное поведение tar архивов, что путь можно любой указать. И как конкретно оно сбегает из "контейнеров"? Подразумевается питоновская бурная деятельность с venv вместо неймспесов линукса?
| |
1.13, Аноним (13), 07:03, 06/06/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Да пофиг. Всё равно этот модуль нужен исключительно для программного доступа к содержимому. Кому распаковывать - те ручками распакуют куда надо.
| |
|
2.24, 1 (??), 09:56, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
А потом, какой-нибодь Sony программист, поставит лишний пробел в скрипте обновления ....
| |
|
1.25, Аноним (25), 10:01, 06/06/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Странно что выпустили фикс только для 3.12 и 3.13. Или в ранних версиях нет такого модуля?
| |
|
2.34, userd (ok), 13:25, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Модуль tarfile появился в Python 2.3.
TarFile.extract()/TarFile.extractall() позволяют при распаковке заменить любой доступный файл - по абсолютному пути или по относительному вне текущего директория.
Когда-то консольный tar тоже это позволял, но потом была осознана опасность tarbomb и консольные tar-ы прикрыли ключиками (-P, --absolute-paths).
В версии 3.10 у методов extract/extractall появился параметр filter, который должен давать возможность управлять разрешением на извлечение файлов в сомнительных случаях. Вот это управление оказалось повреждено в 3.12. О чём, собственно, и новость.
| |
2.47, Аноним (47), 22:07, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
> Или в ранних версиях нет такого модуля?
Ранние версии не поддерживаются, и исправлять там ничего не будут. Не можете обновиться на актуальный питон - вас поломают, и поделом.
| |
|
1.26, Аноним (8), 10:40, 06/06/2025 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Чёт бот скрывает все сообщения подряд.
>Пути как строки принимает любая современная ОС, вы что-то пургу несёте какую-то. Обработать строку и убрать оттуда "/../" - дело максимум 20 строк в цикле.
Оно всё дело 20 строк. Хоть подсчёта длины массива, как в эпичном баге grub с 28 backspace, хоть в sql запросах экранировать переменные, хоть здесь. Если программист этого не помнит, а такое частенько случается, то вопрос в том, напомнит ли ему об этом хоть кто-то или нет. В языках типа си, программисту никто ничего никогда не напомнит, все баги будут исключительно на его совести. В языках типа окамла, программисту специально ставят определённые заграждения, чтобы даже если он что-то забудет, то произойдёт ошибка компиляции, где программисту напомнят об этом. Это как со станками, когда вначале в станок ставят деталь, а потом, работник двумя руками нажимает на предохранители. Потому, что деталей много, может кто-то куда-то спешит, а вот запасных рук у работника нет. И такой подход позволяет выражать свои намерения явно: нужен ли доступ сразу ко всей файловой системе, или какой-то части.
| |
|
2.27, User (??), 12:24, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Нуээээ... в "нормальных" языках - что бы там не могла обработать на входе сама ОС - "нормальный" программист будет работать не со "строками", а со специально предназначенными для работы с путями "объектами", которые - да-да, хорошо так снижают возможности выстрелить себе в ногу.
| |
|
3.35, Александр (??), 13:47, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Никакой язык не избавит от такого бага. тут уже плоскость логики: в случае А тебе нужно подняться наверх по каталогам, а в случае Б - нет. Чем язык поможет?
| |
|
4.36, Аноним (8), 13:55, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Выше пример
Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)
Бросит исключение, так как подниматься выше cwd запрещено.
| |
|
5.37, Аноним (12), 14:23, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Скипну с вашего позволения аналогию напечатать 20 строк кода, которые всегда можно переписать заного, и ногами в станке.
Ваш пример:
> Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)
это просто тот же самый фильтр в стрингбилдере, который просто за вас кто-то написал. Нету волшебной кнопки "сделай хорошо", есть код который выглядит чуть иначе, чем
> static int sanitize_path_cwdonly(char *buf /* modify inplace */); | |
|
6.41, Аноним (8), 17:51, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
>это просто тот же самый фильтр в стрингбилдере, который просто за вас кто-то написал.
Нет. read_dir не примет в качестве аргумента строку, будет ошибка компиляции. А дальше, предполагается, что человек пойдёт в документацию, и выяснит, как это сделать правильно.
> static int sanitize_path_cwdonly(char *buf /* modify inplace */);
Знаете, в чём проблема вашего кода? Это просто объявление функции, без тела. Языку си уже больше полувека, а вы до сих пор приводите гипотетическое решение, а не ссылку на хотя-бы сколь нибудь популярную сишную библиотеку. И никаких намёков, что это решение будет хоть в каком-то виде, хотя-бы когда-то.
| |
6.46, Аноним (-), 21:01, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
> static int sanitize_path_cwdonly(char *buf /* modify inplace */);
И как это будет работать? Допустим в пути симлинк, и когда это санитайзер будет вычислять канонический путь от корня, он получит более длинную строку, чем размер буфера, который он кстати даже не знает. Что ему делать в такой ситуации?
Ты мыслишь так, как мыслили диды в 80-х годах. И с таким мышлением, у тебя код вечно будет в багах. Причём и санитизировать пути тебе не удастся полностью, и с памятью работать корректно тоже, потому что пытаясь решить первую проблему, ты начинаешь рыть себе яму второй проблемы.
| |
|
5.40, Аноним (-), 17:36, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
Это не решение проблемы. Решением будет запрет использовать API открытия файлов стандартной библиотеки, и предоставление альтернативного API, который будет проверять пути. За попытки использовать стандартную библиотеку расстреливать на месте. Можно скрипт написать, который будет проверять коммиты на наличие вызовов функций стандартной библиотеки, реджектить эти коммиты и вызывать расстрельную команду.
Довольно просто с организационной точки зрения. Но язык тут ни при чём.
Кстати, твой пример не спасает, например, от симлинков, которые могут выводить за пределы того дерева файлов, которым ты хочешь ограничить свою программу.
| |
|
6.42, Аноним (8), 18:01, 06/06/2025 [^] [^^] [^^^] [ответить]
| +/– |
>Решением будет запрет использовать API открытия файлов стандартной библиотеки
Ну что вы так с козырей то заходите? Если использовать линтер, то и раст внезапно не нужен, так как проверка владения может быть на стороне линтера. Но есть одна проблема: сишники являются идеологическими противниками любых линтеров, а ещё, они изобретают велосипеды. Так что удачи хотя-бы одного сишника уболтать на это.
>Кстати, твой пример не спасает, например, от симлинков
Разумеется, вы не правы, я это проверил. Поскольку в окамле принято использовать библиотеки, а не велосипедить каждый раз, то данный случай в библиотеке учтён. Что опять таки выгодно отличает окамл от си.
| |
|
|
|
|
|
|