Howto: CodeIgniter Basic + Security Setup

0
343

Heute möchte ich mal vorstellen, wie mein Basis Setup vom PHP-Framework CodeIgniter von statten geht.

Herunterladen der benötigten Daten

Unter folgendem Link könnt ihr euch die Source-Files hierfür herunterladen:

https://codeigniter.com/

Wichtig für mich sind immer folgende Files:

  • CodeIgniter 3.x Core-Files
  • CodeIgniter 3.x System Translation Files (auch wichtig für die Formular Validierungen)

Kopieren der Files in das WebServer Home-Directory

Ich selbst nutze für meine Entwicklung weiterhin MAMP PRO. Also kopiere ich die Dateien in meinen Webspace. Wichtig: Die Translation Files gehen in das Application Directory – ich kopiere diese manuell immer im Anschluss.

Ich habe den Host ci-basic verknüft, wenn alles korrekt war, erhaltet ihr folgendes im Browser:

Nach der Basis-Installation – Anpassen CodeIgniter

Sobald das Projekt im Browser aufgerufen werden kann, passe ich mein Setup noch weiter an.

Zuerst benötige ich eine .htaccess damit ich SEO-Friendly Links verwenden kann, diese lege ich direkt im Hauptverzeichnis ab:


RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?/$0 [PT,L]
RewriteCond $1 !^(index\.php|images|assets|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

SetEnv CI_ENV local

Meine Gründe hierfür:

Zeile 1-6: Rewrite Rules, diese erlauben uns URLs wie https://myProject/Dashboard
Zeile 8: Teilen wir CodeIgniter mit, wo wir uns befinden.

Ich verwende verschiedene „Stages“ zur Entwicklung. Meine „Stages“ etwas genauer erklärt:

  • local –> Meine lokale Entwicklungsumgebung
  • dev –> Meine Testumgebung auf meinem Webserver
  • production –> Meine Live-Umgebung, auf die ich erst deploye, wenn ich auf dev keine Fehler mehr entdecken kann

Grundsätzlich: Diese Entscheidung habe ich getroffen, da ich:

  • Auf local –> Mir alle Fehler ausgeben kann, aber noch in meiner Mac / Windows Umgebung bin
  • Auf Dev –> Bin ich auf meinem Live Server – aber in einer gekapselten Umgebung. Ich kann hier prüfen, ob die Anwendung unter „Live“ Bedingungen funktioniert – lasse mir hier aber noch alle Fehler ausgeben
  • Auf Production –> Sind wir Live. Hier werden keine Fehler mehr ausgegeben und nicht mehr erwartet

Sobald dies getätigt ist, teste ich erneut – funktioniert die Umgebung noch? Sobald die Browser Umgebung die Seite wie oben gezeigt ausgibt, haben wir erstmal alles richtig gemacht.

Als nächstes müssen in der Config mindestens folgende Dinge angepasst werden:

Im Config-Ordner passen wir folgendes an (bitte hier eintragen, was für euch korrekt ist):

    • Autoload.php
      
      $autoload['libraries'] = array('database', 'session', 'user_agent');</pre>
      
      $autoload['helper']    = array('url', 'html');
      $autoload['model']     = array('_system/my_controller_model' => 'my_model');
      

      Anmerkung, wir erstellen später noch einen MY_Controller – das DB-Model binden wir hier schon global ein. Wir können dies dann später über my_model nutzen.

    • Config.php
      
      $config['base_url'] = 'http://ci_basic_setup';
      $config['language']	= 'german';
      ...
      $config['sess_driver'] = 'files';
      $config['sess_cookie_name'] = 'ci_basic_session';
      $config['sess_expiration'] = 7200;
      $config['sess_save_path'] = NULL;
      $config['sess_match_ip'] = FALSE;
      $config['sess_time_to_update'] = 300;
      $config['sess_regenerate_destroy'] = FALSE;
      ...
      $config['csrf_protection'] = true;
      $config['csrf_token_name'] = 'csrf_token';
      $config['csrf_cookie_name'] = 'csrf_cookie';
      $config['csrf_expire'] = 28800;
      $config['csrf_regenerate'] = false;
      $config['csrf_exclude_uris'] = array();
      
      

      Zur Erklärung:

      Zeile 1: Hier bitte den von euch genutzt HOSTNAME / DOMAIN eintragen
      Zeile 4-10: Meine angepasste Session Konfiguration, gerne nach Belieben anpassen
      Zeile 12-17: Ich möchte CSRF Protection nutzen. Da wir das CodeIgniter Framework mit viel AJAX nutzen, habe ich die CSRF Token Gültigkeit etwas verlängert

    • Database.php
      Hier tragt ihr einfach eure Datenbank ein
    • Routes.php
      
      $route['default_controller'] = 'dashboard';
      $route['404_override'] = '';
      $route['translate_uri_dashes'] = TRUE;
      $route['assets/(:any)'] = 'assets/$1';
      
      

      Hier habe ich eine weitere Route angelegt, die assets Route. Außerdem habe ich die Option ‚translate_uri_dashes‘ aktiviert. Somit kann ich später Controller anlegen wie ‚User_Home.php‘, welches im Browser SEO-friendly als http://DOMAIN/User-Home aufgerufen werden kann.

      Da mein neuer Controller nun Dashboard heißt, und nicht mehr Welcome, müssen folgende weitere Anpassungen vorgenommen werden:
      Unter Controller/Welcome -> Diesen Umbenennen zu Controller/Dashboard (auch den Klassennamen ändern!)

    • Anlegen des System DB-Models:
      
      // Filename: models/_system/My_controller_model.php
      
      <?php defined('BASEPATH') OR exit('No direct script access allowed');
      
      class My_controller_model extends CI_Model
      {
          public function __construct()
          {
              parent::__construct();
          }
          
      }
      
      

      Ich möchte gerne einen eigenen, geerbten Controller, verwenden. Daher lege ich mir noch einen My_controller an, von dem alle geschützten Inhalte per Controller aufgerufen werden:

      
      // Filename: /core/My_controller.php
      
      <?php defined('BASEPATH') OR exit('No direct script access allowed'); class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); // Setzen von global gültigen Vars und DB-Model $this->load->model('system/my_controller_model', 'my_controller_model');
      
              /*
          	 * Definition per Array, welche weiteren JS Files benötigt werden, hier als NULL ARR
          	 * damit diese, falls fehlend, nicht als ERR markiert werden
          	 * Hinweis: die JS Dateien werden aus dem Ordner \assets\js_tools geladen!
          	 */
          	$this->data['js_include_files'] = array();
          	
          	/*
          	 * Definition per Array, welche weitere JS Standard Files benötigt werden
          	 * Hinweis: Diese JS Files haben den Base Path \assets\vendors
          	 */
          	$this->data['js_vendor_files'] = array();
          	
          	/*
          	 * Definition von allen CSS Dateien die eingebunden werden
          	 * Hinweis: Base Path ist hierfür \assets\css
          	 */
          	$this->data['css_include_files'] = array();
          }
      }
      
      

       

Ich verwende gerne einen Utility Helper, um häufige benötigten Code auszulagern.

      1. Utility Helper anlegen:
        
        <?php
        
        // Filename: helpers/utility_helper.php
        
        if ( ! defined('BASEPATH')) exit('No direct script access allowed');
        
        if ( ! function_exists('asset_url()'))
        {
             function asset_url()
             {
                  return base_url().'/assets/';
             }
        }
        
        

         

      2. Den Utility Helper standardmäßig laden
        Damit dieser Standardmäßig geladen wird, passen wir noch die Config/autoload.php entsprechend an:

        
        $autoload['helper'] = array('url', 'html','utility');
        
        

         

Abschluss der Konfiguration

Ich persönlich binde immer noch eine assets/js/config.js ein:


<!-- Einbinden des SELECT2 Fixes (Behebung von optischen Fehlern bei Bootstrap Modals -->
<script type="text/javascript">
    $.fn.modal.Constructor.prototype.enforceFocus = function () {};
</script>

<!-- Mappen von CI und CSRF Token, damit diese auch per Javascript erreichbar sind: -->
<script type="text/javascript">
    var base_url.   = '<?= base_url();    ?>';
    var current_url = '<?= current_url(); ?>';
    var asset_url   = '<?= asset_url();   ?>';

    // CSRF Token
    var csrf_token = '<?= $this->security->get_csrf_hash(); ?>';

</script>


 

Geschafft ,-) Bitte prüft regelmäßig, beim Abarbeiten des Tutorials, ob eure CI Instanz noch lauffähig ist. Habt ihr Fragen, Verbesserungsvorschläge oder wollt ihr euch einfach nur bedanken? Lasst es uns doch gerne über die Kommentarfunktion wissen.