Node.js не является браузером javascript. Есть много его частей, которые используют функции ОС, недоступные в контексте браузера. Способ делать то, что вы хотите делать, находясь в браузере для клиента, заключается в том, чтобы не использовать сокет TCP, а вместо этого искать в WebSockets (например, socket.io, который предлагает сервер и клиенты браузера).
Выезд, Неизменный Garry Dolley.
Можно предотвратить переопределение отдельных методов.
Я не думаю, что это - беспокойство.
Да, мифическое "кто-то" может заменить реализацию 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!
Java обеспечивает много других инструментов для безопасного программирования
Первоначально я думал, что Вы говорили о нормальном безопасном программировании, где идея состоит в том, чтобы защитить программу (или Ваше подмножество его или Ваша единственная функция) от недопустимого ввода данных.
Это - большая вещь, и я поощряю всех идти чтение та статья.
Однако кажется, что Вы на самом деле говорите о "защите Вашего кода от других программистов".
По-моему, это - абсолютно бессмысленная цель, как, независимо от того, что Вы делаете, злонамеренный программист может всегда запускать Вашу программу под отладчиком или использовать внедрение DLL или любое количество других методов.
Если Вы просто стремитесь защитить свой код от некомпетентных коллег, это смешно. Обучите своих коллег или получите лучших коллег.
Во всяком случае, если такие вещи вызывают большое беспокойство у Вас, рубин не является языком программирования для Вас. Monkeypatching там дизайном, и запрещать его идет вразрез со смыслом функции.
Я предполагаю, что Ruby имеет это, функция - оценила больше по нему являющийся проблемой безопасности. Ducktyping также.
Например, Я могу добавить свои собственные методы к Строковому классу Ruby вместо того, чтобы расширить или перенести его.
Вы могли смотреть на то, Почему проект "Песочницы" Lucky Stiff, который можно использовать, если Вы волнуетесь о потенциально под управлением небезопасном коде. http://code.whytheluckystiff.net/sandbox/
Пример (TicTacToe онлайн): http://www.elctech.com/blog/safely-exposing-your-app-to-a-ruby-sandbox
Если исправление обезьяны является Вашим concen, можно использовать Неизменный модуль (или одна из подобной функции).
"Обучите своих коллег или доберитесь, лучшие коллеги" работает отлично для маленького запуска программного обеспечения, и он работает отлично для больших пушек как Google и Amazon. Смешно думать что каждый непритязательный разработчик, законтрактованный в для некоторого маленького медицинского приложения диаграмм в кабинете врача в незначительном городе.
Я не говорю, что мы должны создать для наименьшего общего знаменателя, но мы должны быть реалистичными, что существует много посредственных программистов там, которые вытянут в любой библиотеке, которая сделала задание, не уделив внимания безопасности. Как они могли обратить внимание на безопасность? Возможно, брать алгоритмы и класс структур данных. Возможно, они посещали урок компиляторов. Они почти наверняка не посещали урок протоколов шифрования. Они определенно все не считали Schneier или любых из других там, кто практически должен попросить и умолять даже очень хороших программистов рассматривать безопасность при создании программного обеспечения.
Я не волнуюсь по поводу этого:
require 'evil_cracker_lib_from_russian_pr0n_site'
require 'awesome'
Я волнуюсь по поводу awesome
требование foobar
и fazbot
, и foobar
требование has_gumption
, и... в конечном счете два из них конфликтуют некоторым неясным способом, который отменяет важный аспект безопасности.
Один важный принцип защиты является "защитой подробно" - добавляющий, что эти дополнительные уровни безопасности помогают Вам от случайной стрельбы в себя в ноге. Они не могут полностью предотвратить его; ничто не может. Но они помогают.
Раганвальд имеет недавнее сообщение об этом. В конце он создает следующее:
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
как открытый метод для Acronym
s, но держит внутренние кишки (fu
и bar
) частный и скрывает модуль помощника от внешнего представления.
Если кто-то monkeypatched объект или модуль, то необходимо посмотреть на 2 случая: Он добавил новый метод. Если он - единственный, добавляющий этот meyhod (который вероятен), то никакие проблемы не возникают. Если он не единственный, необходимо видеть, делают ли оба метода то же и говорят разработчику библиотеки об этой серьезной проблеме.
Если они изменяют метод, необходимо начать исследовать, почему метод был изменен. Они изменяли его из-за некоторого поведения пограничного случая, или они на самом деле исправляли ошибку? особенно в последнем случае, monkeypatch является вещью бога, потому что это исправляет ошибку во многих местах.
Помимо этого, Вы используете очень динамический язык учитывая, что программисты используют эту свободу нормальным способом. Единственный способ удалить это предположение не состоит в том, чтобы использовать динамический язык.