Tom: Sicherheit beim Upload

Beitrag lesen

Hello,

Ich soll also die ganze Datei durch den Speicher schaufeln? Kannst du mir erklären, wie ich das bei vielen Uploads mache ohne dass das RAM knapp wird?

Üblicherweise nimmt man eine Blockgröße von wenigen KB. Damit ist der RAM-Verbrauch sehr überschaubar.

Viel wichtiger ist aber, dass Du dir nochmal durchliest, was ich bisher im Artikel schon geschrieben habe über

  • open_basedir
  • upload_tmp_dir
  • Kontrolle des Dateinamens (keine Pfade!)
  • Kontrolle der Dateiendung (möglichst richtigstellen laut MIME-Type)
  • keine Scripte zulassen
  • am besten nur bestimmte Dateiendungen zulassen aus einer Positivliste
  • Scriptausführung im Ablageverzeichnis (wenn es über HTTP/s erreichbar ist) unterbinden

Also soll ich meine Funktion so entwerfen, dass ein Anwender den Hoster vorschreiben muss, wie er seinen Server konfigurieren muss?

... richtig auswählen, nicht bevormunden

Bei Shared Hosting:
Bei PHP als Modul ist ein eigenes upload_tmp_dir für jeden virtual Host mMn die wichtigste Sicherheitsmaßnahme, die aber nur dann greift, wenn open_basedir auch vernünftig eingestellt wird.

Und wie hat mein Script darauf Einfluss? Wäre schon schön, wenn deine Tips auch umsetzbar sind.

Ok, guter Hinweis. Dass man das per Script feststellen kann, darauf werde ich im Artikel also noch eingehen.

Du schaust bitte erstmal in die Ausgaben von phpinfo(). Die sagen Dir (fast) alles.

Leider geben sie auch keine Auskunft darüber, ob die Einstellungen für open_basedir für alle anderen Shared-Hosting-Teilnehmer richtig sind. Denn die sind ja dafür da, dass Dein Script nicht auf die Bereiche der anderen Accounts zugreifen kann und bei den Anderen entsprechend umgekehrt.

Und wie kann das Script prüfen ob die  Einrichtung vernünftig ist? Hast du dafür auch nen Ansatz wie man per Script den Server prüfen kann?

Wie gesagt, dein Hinweis ist gut. Siehe phpinfo()

Aus deinem anderen Posting:

Und selbst wenn ich das Überschreiben verhindern will, wird es mit muf() nur ein Zweizeiler, denn ein file_exists ist doch ein klein wenig weniger Code als die Lösung von dir,die im Übrigen das gleiche Problem bietet, was du anprangerst, da in der Zeit zwischen fopen und flock die Datei von einem anderen Script manipuliert, gelöscht, verschoben, geändert oder sonst was werden kann.

File_exists() ist ungeeigent für derartige Aufgaben. Da wären wir dann schon beim nächsten Thema (TOCTTOU). Aber darüber findest Du im Archiv schon genug Stoff, bevor wir mit dem Diskutieren beginnen ;-)

Manipulation soll und kann damit nicht verhindert werden, dafür sind die Dateirechte und Verzeichniskonfigurationen das Mittel der Wahl. Toms Vorschlag kann wenigstens verhindern, dass zwischen file_exists() und dem Verschieben/Kopieren ein anderer Prozess eine Datei gleichen Namens anlegt, denn fopen($mode: x) offnet die Datei nur, wenn sie nicht existiert. An dieser Stelle kann abgebrochen werden. Dass diese Funktionalität in muf() eingebaut wird, sind bereits Bestrebungen im Gange.

Somit löst dein Ansatz in keinster Weise dein Problem (was IMO keins ist) sondern vergrössert lediglich den Ressourcenverbrauch und die Codelänge, dafür verlängert sich auch die Verarbeitungsgeschwindigkeit.
Somit hat deine Lösung als _keine_ Vorteile aber _sehr viele gravierende_ Nachteile.

Sie hat (noch) den Vorteil, dass sie nicht blind überschreibt. Die muf()-Lösung wird auch zum Mehralszweizeiler, wenn man das Überschreiben ordentlich verhindern will (siehe https://forum.selfhtml.org/?t=206726&m=1404169 ff.). Ansonsten sind die Nachteile eigentlich nur der längere Code und die Manipulierbarkeit der Einträge in $_FILES.

Eben die Manipulation der Einträge in $_FILES sollte doch aber durch fremde Instanzen nicht möglich sein. Das genau zeichnet doch $_FILES (und $_POST und $_GET, ...) aus.

Und den Programmierer vor sich selber schützen kann man sowieso nicht wirklich.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
 ☻_
/▌
/ \ Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
0 133

Sicherheit beim Upload

Nelly
  • php
  1. 0
    Tom
    1. 1
      ChrisB
      1. 0
        Tom
        1. 0
          ChrisB
          1. 0

            $_FILES[<name>]['tmp_name']

            Tom
            • menschelei
            1. 0
              ChrisB
              1. 0
                Tom
                1. 0
                  ChrisB
                  1. 0

                    Dateiupload, was tut move_uploaded_file() wirklich?

                    Tom
                    • php
                    1. 0
                      ChrisB
                      1. 0

                        Rumpaulerei

                        Tom
                        • menschelei
                        1. 0
                          ChrisB
                          1. 0

                            Gültigkeit von Funktionen für den Dateiupload

                            Tom
                            • php
                            1. 0
                              Auge
                              1. 0
                                Tom
                                1. 0
                                  ChrisB
                                  1. 0
                                    Tom
                                    1. 0
                                      ChrisB
                                      1. 0
                                        Tom
                                        1. 0
                                          ChrisB
                                          1. 0
                                            Tom
                                            1. 0
                                              ChrisB
                                              1. 0
                                                Tom
                                                1. 0
                                                  Matti Mäkitalo
                                                  1. 0
                                                    Kai345
                                                    1. 0
                                                      Christian Kruse
                                                  2. 0
                                                    Tom
                                                    1. 0
                                                      Multi
                                    2. 0
                                      Multi
                                      1. 0
                                        Tom
                            2. 0
                              ChrisB
                              1. 0
                                Tom
                            3. 1
                              ChrisB
                              1. 0
                                Tom
                                1. 0
                                  ChrisB
                                  1. 0
                                    Tom
                                    1. 0
                                      ChrisB
                                      1. 0
                                        Tom
                                        1. 0
                                          ChrisB
                    2. 0
                      Christian Kruse
                      1. 0
                        Tom
                        1. 0
                          Christian Kruse
                          1. 0
                            Tom
                2. 1
                  dedlfix
                  • php
                3. 4
                  Matti Mäkitalo
                  1. 0

                    Der Wert von alten PHP-Funktionen

                    Tom
                    • php
            2. 0

              Das geht auch anständiger!

              Der Martin
              • zu diesem forum
              1. 0
                Tom
                1. 1
                  ChrisB
              2. 0
                Gunnar Bittersmann
    2. 0
      Sven Rautenberg
      1. 0
        Tom
        1. 0
          ChrisB
        2. 7
          Sven Rautenberg
          1. 1
            Matti Mäkitalo
            1. 0
              dedlfix
            2. 0
              Tom
              1. 0
                Sven Rautenberg
                1. 0
                  Christian Kruse
                  1. 0
                    Sven Rautenberg
                    1. 0
                      Tom
                  2. 0
                    Tom
          2. 0
            Tom
            1. 0
              ChrisB
              1. 0
                Tom
                1. 0
                  ChrisB
                2. 2
                  Multi
                  1. 0
                    Tom
                    1. 2
                      Multi
                3. 0
                  Der Martin
                  1. 0
                    Tom
                    1. 0
                      ChrisB
            2. 3
              Sven Rautenberg
            3. 3
              dedlfix
              1. 2
                Multi
                1. 0
                  Tom
                  1. 0
                    Matti Mäkitalo
                    1. 0
                      Tom
                      1. 0
                        ChrisB
                        1. -1
                          Christian Kruse
                          1. 0
                            Sven Rautenberg
                            1. 0
                              Christian Kruse
                          2. 0
                            dedlfix
                            1. 0
                              Sven Rautenberg
                              1. 0
                                dedlfix
                                1. 0
                                  Christian Kruse
                                  1. 0
                                    dedlfix
                                    1. 0
                                      Sven Rautenberg
                                      1. 0
                                        dedlfix
                                      2. 2
                                        Christian Kruse
                                        1. 0
                                          Sven Rautenberg
                                        2. 0
                                          Tom
                                          1. 0
                                            Sven Rautenberg
                                            1. 0
                                              Tom
                                              1. 0
                                                dedlfix
                                                1. 0
                                                  Tom
                                                  1. 1
                                                    Sven Rautenberg
                                                    1. 0
                                                      Tom
                                                      1. 0
                                                        ChrisB
                                                      2. 3
                                                        Sven Rautenberg
                                                  2. 0
                                                    dedlfix
                                                    1. 0
                                                      Tom
                                                      1. 2
                                                        ChrisB
                                                      2. 3
                                                        Sven Rautenberg
                                                        1. 0
                                                          Tom
                                                          1. 0
                                                            Matti Mäkitalo
                                                            1. 0
                                                              Tom
                                                          2. 0
                                                            Sven Rautenberg
                      2. 2
                        Multi
                      3. 3
                        Christopher
    3. 0

      Alle OOP-Konzepte, die ich bisher kennengelernt habe...

      Mitleser
      • meinung
    4. 0
      Multi
      1. 0
        Tom
        1. 0

          Sicherheit beim Upload, Ergänzung zu open_basedir

          Tom
        2. 1
          ChrisB
        3. 0
          Multi
          1. 0
            dedlfix
            1. 0
              Tom
              1. 0
                dedlfix
                1. 0
                  Tom
                  1. 0
                    dedlfix
                    1. 0
                      Tom
                      1. 0
                        dedlfix
                        1. 0
                          Tom
                          1. 0
                            dedlfix
                            1. 0
                              dedlfix
                              1. 0
                                Tom
                          2. 0
                            Mitleser
        4. 1
          Multi
  2. 1
    dedlfix
    1. 0
      molily
  3. 0
    Multi