Как я могу программировать оборонительно в Ruby?

Node.js не является браузером javascript. Есть много его частей, которые используют функции ОС, недоступные в контексте браузера. Способ делать то, что вы хотите делать, находясь в браузере для клиента, заключается в том, чтобы не использовать сокет TCP, а вместо этого искать в WebSockets (например, socket.io, который предлагает сервер и клиенты браузера).

5
задан James A. Rosen 8 April 2009 в 13:48
поделиться

9 ответов

Выезд, Неизменный Garry Dolley.

Можно предотвратить переопределение отдельных методов.

1
ответ дан 18 December 2019 в 08:33
поделиться

Я не думаю, что это - беспокойство.

Да, мифическое "кто-то" может заменить реализацию MD5 с чем-то небезопасным. Но чтобы сделать это, мифическое, кто-то должен на самом деле смочь получить его код в процесс Ruby. И если он может сделать это, затем он, по-видимому, мог бы также ввести свой код в процесс Java и например, переписать байт-код для операции MD5. Или просто прервите нажатия клавиш и не на самом деле обеспокойтесь игрой с кодом криптографии вообще.

Одна из типичных проблем: я пишу эту потрясающую библиотеку, которая, как предполагается, используется как так:

require 'awesome'
# Do something awesome.

Но что, если кто-то использует его как так:

require 'evil_cracker_lib_from_russian_pr0n_site'
# Overrides crypto functions and sends all data to mafia
require 'awesome'
# Now everything is insecure because awesome lib uses 
# cracker lib instead of builtin

И простое решение: не делайте этого! Обучите своих пользователей, что они не должны выполнять недоверяемый код, который они загрузили с неясных источников в своих важных приложениях безопасности. И если они делают, они, вероятно, заслуживают его.

Возвратиться к Вашему примеру Java: это верно, что в Java можно сделать код crypto private и final и что нет. Однако кто-то может все еще заменить Вашу crypto реализацию! На самом деле кто-то на самом деле сделал: много реализаций Java с открытым исходным кодом используют OpenSSL для реализации их криптографических стандартных программ. И, как Вы, вероятно, знаете, Debian, поставленный с поврежденной, небезопасной версией OpenSSL в течение многих лет. Так, вся работа программ Java Debian для нескольких прошлых лет на самом деле работала с небезопасным crypto!

9
ответ дан 18 December 2019 в 08:33
поделиться

Java обеспечивает много других инструментов для безопасного программирования

Первоначально я думал, что Вы говорили о нормальном безопасном программировании, где идея состоит в том, чтобы защитить программу (или Ваше подмножество его или Ваша единственная функция) от недопустимого ввода данных.
Это - большая вещь, и я поощряю всех идти чтение та статья.

Однако кажется, что Вы на самом деле говорите о "защите Вашего кода от других программистов".

По-моему, это - абсолютно бессмысленная цель, как, независимо от того, что Вы делаете, злонамеренный программист может всегда запускать Вашу программу под отладчиком или использовать внедрение DLL или любое количество других методов.

Если Вы просто стремитесь защитить свой код от некомпетентных коллег, это смешно. Обучите своих коллег или получите лучших коллег.

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

4
ответ дан 18 December 2019 в 08:33
поделиться

Я предполагаю, что Ruby имеет это, функция - оценила больше по нему являющийся проблемой безопасности. Ducktyping также.
Например, Я могу добавить свои собственные методы к Строковому классу Ruby вместо того, чтобы расширить или перенести его.

1
ответ дан 18 December 2019 в 08:33
поделиться

Вы могли смотреть на то, Почему проект "Песочницы" Lucky Stiff, который можно использовать, если Вы волнуетесь о потенциально под управлением небезопасном коде. http://code.whytheluckystiff.net/sandbox/

Пример (TicTacToe онлайн): http://www.elctech.com/blog/safely-exposing-your-app-to-a-ruby-sandbox

1
ответ дан 18 December 2019 в 08:33
поделиться

Если исправление обезьяны является Вашим concen, можно использовать Неизменный модуль (или одна из подобной функции).

Неизменный

1
ответ дан 18 December 2019 в 08:33
поделиться

"Обучите своих коллег или доберитесь, лучшие коллеги" работает отлично для маленького запуска программного обеспечения, и он работает отлично для больших пушек как Google и Amazon. Смешно думать что каждый непритязательный разработчик, законтрактованный в для некоторого маленького медицинского приложения диаграмм в кабинете врача в незначительном городе.

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

Я не волнуюсь по поводу этого:

require 'evil_cracker_lib_from_russian_pr0n_site'
require 'awesome'

Я волнуюсь по поводу awesome требование foobar и fazbot, и foobar требование has_gumption, и... в конечном счете два из них конфликтуют некоторым неясным способом, который отменяет важный аспект безопасности.

Один важный принцип защиты является "защитой подробно" - добавляющий, что эти дополнительные уровни безопасности помогают Вам от случайной стрельбы в себя в ноге. Они не могут полностью предотвратить его; ничто не может. Но они помогают.

1
ответ дан 18 December 2019 в 08:33
поделиться

Раганвальд имеет недавнее сообщение об этом. В конце он создает следующее:

class Module
  def anonymous_module(&block)
   self.send :include, Module.new(&block)
  end
end

class Acronym
  anonymous_module do
    fu = lambda { 'fu' }
    bar = lambda { 'bar' }
    define_method :fubar do
      fu.call + bar.call
    end
  end
end

Это выставляет fubar как открытый метод для Acronyms, но держит внутренние кишки (fu и bar) частный и скрывает модуль помощника от внешнего представления.

1
ответ дан 18 December 2019 в 08:33
поделиться

Если кто-то monkeypatched объект или модуль, то необходимо посмотреть на 2 случая: Он добавил новый метод. Если он - единственный, добавляющий этот meyhod (который вероятен), то никакие проблемы не возникают. Если он не единственный, необходимо видеть, делают ли оба метода то же и говорят разработчику библиотеки об этой серьезной проблеме.

Если они изменяют метод, необходимо начать исследовать, почему метод был изменен. Они изменяли его из-за некоторого поведения пограничного случая, или они на самом деле исправляли ошибку? особенно в последнем случае, monkeypatch является вещью бога, потому что это исправляет ошибку во многих местах.

Помимо этого, Вы используете очень динамический язык учитывая, что программисты используют эту свободу нормальным способом. Единственный способ удалить это предположение не состоит в том, чтобы использовать динамический язык.

0
ответ дан 18 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: