Ответ 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 - О том, насколько безопасно безопасно.