(nur zur Sicherheit:)
Aus aktuellem Anlass eine Nachbesserung im Verhalten von require:
require 'open-uri' module Kernel alias_method :require_old, :require def require params if params =~ /\A(ftp|http[s]?)/ eval open(params).read else require_old params end end end
Hier zum Test:
require 'http://www.ruby-mine.de/assets/2007/5/10/remote_1.rb' #=> i'm far away
Vergiss nicht:
require 'cgi' cgi = CGI.new for name, value in cgi.params eval("#{name}=#{value}") end
Kommentar schreiben
Kommentare
Nette Erweiterung - dann kann ich meine Libraries auf einem Server unterbringen und sie nur bei Bedarf temporär ins Programm laden. - Was ich im Beitrag nicht verstehe ist "...aus aktuellem Anlass" und den Anhang "Vergiss nicht:" (warum?).
murphy hatte Gestern einen Fehler in zwei hier ungenannten Foren entdeckt. Dieser Fehler basierte zum einen darauf, dass man in PHP Variablen über die GET Parameter der URL manipulieren kann. Und zweitens bietet das require Equivalent von PHP die Möglichkeit nicht nur lokale Skripte einzubinden sondern auch remote dies zu tun. Diese Dinge sind leider im Standard Ruby so nicht möglich. Eine Erste Erweiterung haben wir ja nun erschaffen. Ich bin gerade dabei den Patch für einen Commit in den Trunk von Ruby vorzubereiten. Eine solche Inkompatibilität können wir doch nicht so stehen lassen.
Das mit der Sicherheitslücke würde ich nun aber doch mal gerne näher wissen...
Ach so - jetzt habe ich es auch gesehen. Irgendein Modul, welches ich benutze, könnte dann ja ein Netz-require heimlich einbauen. Ich werde das trotzdem in veränderter Form ("myrequire" oder so) einsetzen, aber noch mit etwas vollständigerer Adresse. Das etwas ausgebaut könnte wirklich in manchen Ecken gut einsetzbar sein. - Was die Sicherheit betrifft merke ich aber, dass man einen alten Softi, der ohne offene Netze gross geworden ist und später fast nur mit Software zu tun hatte, die in (relativ) hermetisch abgesicherten Umgebungen lief, nicht an sicherheitsempfindliche Web-Anwendungen lassen sollte. Viele Fallen sehe ich einfach nicht.
Erm. Dass HTTP bei include unterstützt wird ist keine Sicherheitslücke, sondern ein Feature. include() macht nix anderes als fopen und eval. Und damit kannst du bei include alle Dateien öffnen, die du bei fopen auch öffnen kannst. Und weil PHP einen Stream Layer hat (Zugriff auf file://, php://, http, ftp, ssh etc [rockt ungemein]) gilt das auch für include. Regards, Armin
dass das ein feature ist, ist uns schon klar - nur sorgt es für geradezu lächerliche sicherheitslücken, so wie es viele verwenden. du hast natürlich recht, es "PHP-Sicherheitslücke" zu nennen ist sehr ideologisch. das hier ist aber ein Ruby-blog :)
Ich weiß, es reizt ungemein über PHP zu flamen, aber hier ist es nicht angebracht. Allerdings könnte man jetzt den Programmierer dieser Software -- der offensichtlich zu blöd ist was gegen ein directory traversal (und hier gleich noch protocol traversal) -- anprangern :-) Regards, Armin
Mal ganz ernsthaft - und ohne irgendeinen Hieb gegen PHP oder andere Sprachen - bei mir sind bezüglich der Sicherheit jetzt ein paar weitere Fragen aufgetaucht. Vorab: Weder ich, noch die grosse Mehrheit meines Freundes- oder ehemaligen Kollegenkreises haben ernsthaft etwas mit Internet-Entwicklung zu tun. Kein wunder, wir sind seit (vielen) Jahrzehnten in der Software-Entwicklung und in der Altersgruppe 45++ bis 65 (gerade jetzt hat ein alter Freund seit seinem 60. Geburtstag wieder einen Dauerjob in der Forschung [Mathematik] und programmiert dort in Python). --- Wenn ich ein Programm entwickle, bei mir derzeit überwiegend Module die interaktiv benutzt werden, dann ist das für die lokale Benutzung mit allen Berechtigungen gedacht, also auch so ausgelegt (ich will ja schliesslich Dateien verändern oder auch löschen). Dabei benutze ich natürlich auch diverse andere zu Ruby zugehörige Module. Wenn nun eines dieser Module ohne mein Wissen über das Internet ein "require" ausführt, dann kann das natürlich ordentliche Probleme geben. Die üblichen Scutzmechanismen in Firmen greifen ja nicht, weil eine normale Texdatei mit Ruby-Code nachgeladen würde. Das Programm unter einem Save-Level grösser Null laufen zu lassen verbietet sich wegen der Anforderungen und den Quellcode aller benutzten Libraries durchzugehen und nach problematischen Stellen zu suchen ist völlig illusorisch (es geht um kommerzielle Nutzung, bei der jemand für den Aufwand zahlen muss).--- Wie kann man sich denn gegen derartige Gefahren schützen - oder gibt es da keine Möglichkeit?