Application Environment (Zend Framework) automatisch setzen

| Keine Kommentare

Wer (Web-)Anwendungen schreibt, verwendet sicher verschiedene Konfigurationen, z.B. ‘development’ für die Entwicklung oder ‘production’ für den öffentlichen Bereich.

Diesbezüglich bietet das Zend Framework mit Zend_Application und Zend_Config ja schon sehr gute Möglichkeiten an.

Der heutige Tipp ist eher ein kleiner Workaround, wenn man kein komplexes Deployment hat bzw. braucht und trotzdem die Umgebung nicht manuell einstellen will.

Dafür nehme ich erstmal das Beispiel für die index.php aus dem Quickstart, so wie es wahrscheinlich den meisten bekannt sein wird.

<?php
// Define path to application directory
defined('APPLICATION_PATH')
  || define('APPLICATION_PATH',
            realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
  || define('APPLICATION_ENV',
            (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
                                       : 'production'));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
  APPLICATION_ENV,
  APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap()
            ->run();

Der für uns wichtige Teil ist die Definition von APPLICATION_ENV.

An dieser Stelle wird geprüft, ob die Konstante bereits definiert ist oder nicht. Falls das nicht der Fall sein sollte, wird zusätzlich geprüft, ob der Wert über die Server-Konfiguration bzw. die .htaccess-Datei verfügbar ist.

Wir haben also schon die Möglichkeit, den Wert in der Server-Konfiguration abzulegen. Das hätte den Vorteil, dass wir unser Programm nur noch auf den Server spielen müssen und automatisch die richtige Konfiguration verwendet wird.

In der .htaccess würde das dann so aussehen:

SetEnv APPLICATION_ENV production

Oftmals kommen wir aber auch nicht an die Konfiguration ran und wollen die Einstellung, aus welchen Gründen auch immer, nicht in der .htaccess haben.

Dann könnten wir die index.php an der entsprechenden Stelle erweitern und APPLICATION_ENV anhand des Servernamens setzen.

Das ist bequem, kann aber auch sicherheitsrelevante Probleme mit sich bringen!

Angenommen wir verwenden folgendes Namensmuster:

  • www.example.com = Live/Produktiv (production)
  • staging.example.com = Abnahme (staging)
  • development.example.com = Entwicklung (development)

In der index.php würde das dann so aussehen:

<?php
// ...
if(!defined('APPLICATION_ENV')) {
  if(getenv('APPLICATION_ENV')) {
    define('APPLICATION_ENV', getenv('APPLICATION_ENV'));
  }
  else if('development.example.com' == $_SERVER['SERVER_NAME']) {
    define('APPLICATION_ENV', 'development');
  }
  else if('staging.example.com' == $_SERVER['SERVER_NAME']) {
    define('APPLICATION_ENV', 'staging');
  }
  else {
    define('APPLICATION_ENV', 'production');
  }
}
// ...

Der Else-Zweig definiert hier die Konstante für die Produktivumgebung.

Damit sollte im Zweifelsfall immer die Einstellung gewählt sein, die am sichersten (keine detaillierten Fehlerausgaben o.ä.) und am schnellsten arbeitet.

Die Sicherheitslücke besteht jedoch darin, dass es möglich wäre, die Anwendung im Entwicklungsmodus zu verwenden. Je nach Einstellung könnten so sensible Daten öffentlich werden.

Dafür müsste das Namensschema bekannt sein und die Namensauflösung zur Ip-Adresse umgangen werden. Es ist ein relativ geringes Risiko, trotzdem ist es eins.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Bedienung, Bedingung, Benchmark, Berechtigung, Berlin, Bildbearbeitung, Bildschirmfoto, Blog, Blogroll, BOM, Bootstrap, Bot, Browser, Bugtracker, Byte Order Mark, Bücher, Cache, CakePHP, Call-Center, Callback, CamelCase, Canvas, Captcha, CDN, Cheatsheet, CLI, Clickout, Closure, Cloud, CodeSniffer, Collection, Community, Comparator, Config, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CRUD, CSS, CSV, CustomLibrary, Custom_Model, Daemon, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Datum, Debug, Decorator, Dekorierer, Design, Design Patterns, Doctrine, Dokumentation, Dump, Duplikat, each, EC2, Eclipse, Email, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Event, Eventhandling, Exception-Handling, Extension, Facebook, Factory, Fallback, Fehler, Fehlermeldung, Filter, Firefox, Flash, flexigrid, Foreach, Formatierung, Formular, Framework, FTP, Funktion, Futon, ga:pi(), Getter, Google Analytics, Hash, Hash-Bang, Header, htaccess, HTML5, htpasswd, HTTP, HTTPS, IDE, If, Implementierung, InnoDB, Interceptor, Interface, Internet Explorer, isset, Iterator, Java, JavaScript, Job, jQuery, Kommentar, Konfiguration, Konsole, Kontrollstruktur, kopieren, kostenlos, Kundenbetreuung, Late Static Binding, Layout, Links, Linux, Listeners, Lizenz, Logging, Löschen, Magento, Magic Methods, Manual, ManyToMany, Marketing, Methode, Model, Monolog, MVC, MySQL, NetBeans, Network, Nirvanix, Objekt, Observable, Observer, OneToMany, Online Tool, OOP, Open Source, Operator, OR-Mapper, Order, ORM, O’Reilly, Parameter, Partnersuche, Passwort, Performance, PHP, php.ini, PHP hates me, phpMyAdmin, PHPUnit, Plugin, Popup, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Request, Response, Responsive Design, Rest-API, Rockstar, Rollback, Routing, S3, Samba, Scheifen, Schleife, Schutz, Screenshot, Secure Shell, Selbstreferenz, Server, Setter, setTimeout, Shop, Sicherheit, Sicherung, Sichtbarkeit, Singleton Pattern, Skin, SOAP, Social Network, Software, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, Splittest, SSH, SSL, Stammtisch, Statement, static, Statistik, Status, Stellvertreter, Strategy Pattern, Stream, String, Stuttgart, Stylesheet, Subversion, Sun VirtualBox, Support, SVN, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Theme, Thumbnail, Tool, Tour, Tracking, Twig, Twitter, Type-Cast, Ubuntu, Umwandlung, Underscore, unset, Update, Upload, Url, User Story, Validierung, Vererbung, Versionskontrolle, Versionsnummer, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Warteschlange, Webserver, Webservice, Weiterleitung, Werkzeug, Windows, WindowsAzure, WordPress, Wrapper, Writer, XML, Youtube, Zeitschleife, Zeitsteuerung, Zend Framework, Zend_Application, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Reflection, Zend_Service, ZPress, Zugangskontrolle, Zugriffsmethode