Безпечний спосіб `enable-local-змінних`?


13

Я успадкував файл .emacs від свого друга близько 18 років тому. Посередині поховано наступні зловісні коментарі, що попереджають про наслідки для функції enable-local-variablesфункції:

;; Date: Wed, 7 Dec 1994 11:57:50 -0600
;; From: blob@syl.dl.nec.com (David Blob)
;; Subject: Self-extracting emacs elisp code
;;
;; With all this talk about self extracting mail "viruses", a friend
;; showed me that in emacs (which I use to read mail, along with vm)
;; has the ability to self-extract elisp code. This feature seems to
;; be turned on by default, and it not only applies to mail read with
;; emacs, but rather every file visited (when the feature is on, of
;; course).
;;
;; The way it works is by having a line which reads "Local Variables:"
;; followed by the lisp variables you would like to set...well, it may
;; seem petty, but you can execute programs, make connections and much
;; more through cleverly written elisp code contained within.
;;
;; It's simple to turn off, at any rate...
;;
;; (setq enable-local-variables  f) ;; turns off feature  (in emacs 19)
;; (setq enable-local-variables  1) ;; makes it ask first (in emacs 19)
;; (setq inhibit-local-variables t) ;; turns off feature  (in emacs 18)
;;
;; Anyhow, I think the risks here speak for themselves...
;;
(setq enable-local-variables '())

Тому я ніколи фактично не використовував цю local-variablesфункцію, хоча здається, що вона може бути дуже корисною. Чи є спосіб, щоб enable-local-variablesзробити щось корисне, не піддаючи мене на довільні атаки введення коду?

Відповіді:


13

18 років тому ви мали рацію переживати. Але час пішов далі. Починаючи з Emacs 22, існує пристойний вбудований механізм для створення безпечних локальних змінних. Деталі задокументовані в посібнику Emacs Lisp . Найважливіші аспекти:

  • Автори Lisp можуть оголосити безпечні значення для кожної змінної. Це білий список: якщо програміст Lisp не зробив нічого особливого, всі значення вважаються небезпечними.
  • Якщо enable-local-variablesвстановлено значення t(за замовчуванням), Emacs автоматично встановлює безпечні значення та вимагає підтвердження, якщо файл намагається встановити небезпечне значення. Після того, як користувач затвердив значення для даної змінної, це автоматично записується, і Emacs більше не запитуватиме про те саме значення для тієї ж змінної.
  • Якщо enable-local-variablesвстановлено значення :safe, Emacs автоматично встановлює безпечні значення та ігнорує інші.

Таким чином, ви можете зберегти налаштування за замовчуванням, якщо ви не заперечуєте про запрошення, або використовуєте (setq enable-local-variables :safe)для отримання загальних переваг (стиль відступу, формат часових позначок тощо) без ризику та посягань на користувальницький інтерфейс.


(Для повноти / на випадок, коли кому цікаво: Emacs 22 вийшов у 2007 році.)
ShreevatsaR

9

Emacs досить безпечний, коли мова йде про локальні змінні. Він насправді нічого не оцінює для змінних файлів або каталогів, він лише аналізує синтаксис Lisp. Крім того, змінна повинна бути оголошена "безпечною", перш ніж вона буде встановлена ​​Emacs, і ця декларація також включає присудок. Таким чином, змінна може сказати "файл може встановити це, але тільки якщо це рядок".

Це означає, що ви можете безпечно включати локальні змінні. Ви можете просто залишити значення за замовчуванням t- Emacs запитає вас про те, чи слід встановлювати змінні, які не вважаються безпечними, і ви можете вивчити їх першими.

Переконайтеся , що ви НЕ встановіть цю змінну :all, і зробити погляд на значення змінних , перш ніж встановлювати їх , якщо Emacs запитає вас. Ви можете використовувати :safeлише для встановлення змінних, які Emacs вважає безпечними, і ігнорувати решту, але ви можете пропустити деякі матеріали таким чином.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.