Dies ist sicher.
Man kann jederzeit ausführbaren Code in ein Bild schmuggeln:
- Laden Sie einfach Ihren PHP-Code mit einer anderen Erweiterung hoch
- Fügen Sie es in Metadaten wie EXIF ein.
- Verwenden Sie speziell farbige Pixel, sodass ihre binäre Darstellung Ihr gewünschter PHP-Code ist, der die Neucodierung überlebt (ich habe dies tatsächlich gesehen eine im wirklichen Leben, ausgenutzt mit: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/).
Sie sollten also bereits davon ausgehen, dass der Inhalt Ihrer Datei nicht sicher ist, wenn er vom Benutzer bereitgestellt wird. Selbst wenn Sie das Bild neu codieren und Formate konvertieren, ist es immer noch ein Bild, also führen Sie es nicht blutig aus . Wenn Ihr Webserver (wie Apache oder Nginx) ihn über den PHP-Interpreter ausführt, wird jemand einen Weg finden, PHP auszulösen, um etwas Böses zu tun. Indem Sie die Erweiterung als eine der wenigen Erweiterungen auf der Whitelist erzwingen, können Sie Ihrem Webserver mitteilen, dass es sich um ein Image handelt (nicht ausführbar) und dass es nicht über den Interpreter übertragen werden soll.
Es gibt natürlich solche , einige damit verbundene Risiken, die Sie beachten sollten:
- Ihr Benutzer fügt möglicherweise Null-Bytes oder andere lustige Dinge in den Dateinamen ein, sodass er schließlich seine Erweiterung auswählen kann.
- Ihr Benutzer versucht möglicherweise, die Pfadüberquerung zu verwenden, wenn Sie ihn den Dateinamen auswählen lassen, wodurch er möglicherweise alle möglichen Aktionen ausführen kann.
- Möglicherweise machen Sie einen Fehler in der Konfiguration des Webservers, und alles wird durchlaufen der Interpreter unabhängig von der Erweiterung (ich habe dies bereits gesehen: Es ist ein stiller Fehler, da PHP buchstäblich alles ausgibt, was es nicht erkennt, sodass Bilder vor und nach der PHP-Interpretation gleich aussehen).
- Die Datei enthält möglicherweise einen Exploit für einen bestimmten Decoder, z. B. wenn Sie wissen, dass der Administrator Ihr Bild möglicherweise anzeigt und einen Browser verwendet, der Wenn Sie einen anfälligen PNG-Viewer haben, können Sie ein PNG-Bild hochladen, das diese Sicherheitsanfälligkeit ausnutzt.
Die ersten beiden sind leicht zu lösen: Lassen Sie den Benutzer niemals seinen Dateinamen wählen oder zumindest eine Reihe von Zeichen auf die Whitelist setzen, die definitiv sicher sind, wie z. B. ^ [a-zA-Z0-9 _-] * $
(alphanumerisch, Unterstrich und Bindestrich).
Der dritte kann überprüft werden, indem irgendwo eine Datei mit dem Namen "test.png" abgelegt und <? php echo "test1" abgelegt wird.
drin. Wenn Sie die Datei über Curl anfordern, sollte der vollständige Code angezeigt werden. Wenn Sie nur "test1" sehen, ist es anfällig.
Schließlich ist der letzte schwer zu überprüfen und liegt etwas außerhalb des Bereichs. Sie könnten einen Virenscanner auf der Serverseite verwenden, aber Virenscanner erfassen nur einige häufige Fälle und können normalerweise nicht alle Varianten einer Sicherheitsanfälligkeit erkennen, wenn sie überhaupt über die Sicherheitsanfälligkeit Bescheid wissen. Der Benutzer sollte im Idealfall sein System aktualisieren und keine anfällige Software ausführen. Wenn Sie sich jedoch in einer Hochsicherheitsumgebung befinden, sollten Sie die Tiefenverteidigung anwenden und beispielsweise das Bild neu codieren, möglicherweise nur Benutzer Bilder in einer virtuellen Maschine anzeigen lassen usw. Dies ist jedoch für diese Frage nicht möglich
Zusammenfassung: Es gibt einige verwandte Angriffe, von denen Sie nicht gezeigt haben, dass sie gemindert werden. Wenn Sie jedoch nur das Code-Snippet als veröffentlicht betrachten, ist dieser Teil sicher.