Подтвердить что ты не робот

Каковы методы доверия Ruby Object # и Object #?

Я читал о методах строки Ruby в docs и приходил по методам

  • taint
  • trust
  • untaint
  • untrust

Я не знаю, что они делают, в какой ситуации мы их используем? Кто-нибудь использовал их? Примеры были бы приятными.

4b9b3361

Ответ 1

taint и trust являются частью модели безопасности Ruby. В Ruby каждый объект имеет несколько флагов, которые он несет с собой, два из которых - это флаг Trusted и флаг Tainted. Как действуют эти флаги, это зависит от того, что называется безопасным уровнем. Безопасный уровень сохраняется в $SAFE.

Каждая нить и волокно в программе могут иметь собственный уровень безопасности. Безопасные уровни варьируются от 0 до 4, при этом 0 не обеспечивает безопасность и 4 принудительно действует так, что его следует использовать только в том случае, если вы eval код. Вы не можете назначить меньшее значение $SAFE, чем оно уже было. Кроме того, в системах UNIX, где Ruby script работает как setuid, Ruby автоматически устанавливает безопасный уровень в 1.

загрязненность

Когда объект имеет установленный флаг, это означает, что грубо говоря, что объект пришел из ненадежного источника и поэтому не может использоваться в чувствительных операциях. Когда безопасный уровень равен 0, флаг taint игнорируется (но все же установлен, вы можете обратить на него внимание, если хотите). Существует несколько методов, связанных с tainting:

  • taint - Сделать объект испорченным. Вы можете повредить объект на всех уровнях, за исключением безопасного уровня 4.
  • tainted? - Проверьте, не поврежден ли объект.
  • untaint - Удалите потертость с объекта. Это может только использоваться в безопасных уровнях 0, 1 и 2.

Вот пример из pragprog pickaxe (источник), который показывает tainting:

# internal data
# =============
x1 = "a string"
x1.tainted?     → false
x2 = x1[2, 4]
x2.tainted?     → false
x1 =~ /([a-z])/ → 0
$1.tainted?     → false
# external data
# =============
y1 = ENV["HOME"]
y1.tainted?      → true
y2 = y1[2, 4]
y2.tainted?      → true
y1 =~ /([a-z])/  → 1
$1.tainted?      → true

Подводя итог, вы не можете использовать опасные методы для испорченных данных. Поэтому, если вы сделаете это на безопасном уровне 3, вы получите сообщение об ошибке:

eval(gets)

Доверие

Доверие намного проще. Доверие связано с тем, был ли объект получен из надежного или ненадежного источника - в основном, независимо от того, исходит ли он из чего-либо менее безопасного уровня 4 или безопасного уровня 4. Я не уверен, какой именно эффект имеет доверие к Ruby, но Смотри сюда: http://www.ruby-forum.com/topic/1887006.


Вот еще несколько ресурсов: http://phrogz.net/ProgrammingRuby/taint.html - некоторые отличные вещи на безопасных уровнях, но я думаю, что это от версии 1.8 - есть обновленная версия для 1.9, только в печатной версии книга.

http://www.ruby-forum.com/topic/79295 - О том, насколько безопасно безопасно.

Ответ 2

taint и trust каждый устанавливает флаг, который объект носит с собой повсюду. Единственное различие, которое я могу сказать (от ruby-doc.org), состоит в том, что некоторые вызовы методов ведут себя по-разному, когда данные зараженные объекты, в то время как доверие, похоже, полностью зависит от того, что программист должен интерпретировать.

Основная цель tainting - помечать ввод пользователя как потенциально опасный, например. динамически загружаемые данные формы script или CGI. Затем вы применяете методы санировки, которые гарантируют безопасность объектов и их использование до их использования в другом месте вашего кода.

См. также "Какая цель испортить объекты Ruby?".

Ответ 3

Я нашел эту ссылку для меня информативной о tainted Данные в ruby.

http://ruby.about.com/od/advancedruby/a/tainted.htm

"Tainted" - это те, которые были получены от какого-то пользователя вход. Либо из файла, клавиатуры или сети, объект является литералом в программе или создается программой напрямую, это будет испорчено. Флаг tainted всегда присутствует на ваших объектах, все, что вам нужно сделать, это проверить его, прежде чем делать что-то небезопасное. Если вы подтвердили, что данные действительно безопасны, тогда вы можете объект.