printf и небезопасные строки форматирования - PullRequest
3 голосов
/ 08 февраля 2012

Рассматриваемое приложение позволяет пользователям определять свои собственные сообщения (в основном для настройки и / или локализации) в текстовом конфигурационном файле, которые передаются функциям в стиле printf во время выполнения.Если определенная пользователем строка форматирования является ошибочной, может произойти много плохих вещей.

Каков наилучший способ очистки таких введенных пользователем строк форматирования?Или я должен полностью отказаться от этого подхода и использовать другой метод, позволяющий пользователям безопасно настраивать сообщения?

Решение должно быть как-то переносимым (Windows, Linux, BSD, x86, x86-64).

Ответы [ 2 ]

5 голосов
/ 08 февраля 2012

Определите свой собственный язык форматирования, который ваш код переводит в допустимую строку формата, тем самым ограничивая, с какими проблемами может столкнуться пользователь (например, вообще не разрешая%, и определяя свой собственный символ / маркер, чтобы использовать для обозначения% должно появиться в выводе).

0 голосов
/ 08 февраля 2012

У вас есть два варианта:

  1. Позволяют пользовательским беспорядкам (преднамеренным или нет) портить только сами, то есть не позволяют личным конфигурациям пользователей мешать друг другу

  2. Не позволяйте пользователям настраивать результаты. Или, если вы это сделаете, сделайте настройку настолько ограниченной, что они не смогут сделать ничего вредного.
    Например, я часто делал вещи, в которых пользователям разрешено вводить свои данные для таких вещей, как printf(), но фильтры разрешены только для вещей с определенным (очень ограниченным) набором символов. Например, я буду использовать регулярное выражение типа ^[a-zA-Z0-9_]+$ и больше ничего не впущу.

Каждый раз, когда вы предлагаете настройку, вы открываете двери для проблем. Иди осторожно по этим основаниям.

...