itora web

9Dec/100

Implementare Security Component e SSL con CakePHP

CakePHP mette a disposizione un component che permette di rendere la nostra applicazione sicura, per quanto possa essere sicura un applicazione accesibile dal browser, chiaro.
Vediamo come far sì che il nostro sito sia accessibile solo da https:// e non da http://, e come rendere i nostri form sicuri, non editabili con firebug.

Il security component è già nella core di cakePHP, quindi per abilitarlo non dobbiamo fare altro che aggiungere i components necessari in app_controller.php

var $components = array(
	'Security',
	'RequestHandler'
);

e mettere questa funzione, sempre nel nostro app_controller.php

	function beforeFilter(){
		$this->Security->requireSecure();
		$this->Security->blackHoleCallback = 'invalid';
	}

La funzione requireSecure() obbliga il client ad utilizzare ssl, la proprietà validatePost invece dice che i nostri form vanno validati prima di essere processati, infine blackHoleCallback raccoglie tutte le richieste sporche, quelle che non soddisfano le nostre esigenze di sicurezza. Vediamo nel dettaglio la funzione invalid e forceSSL, entrambe all'interno dell'app_controller.php

	function invalid() {
		if(!$this->RequestHandler->isSSL()) {
			$this->forceSSL();
		}else{
			$this->cakeError('accessDenied');
		}
	}

	function forceSSL() {
		$this->redirect('https://' . env('SERVER_NAME') . $this->here);
	}

La funzione invalid separa le richieste, quelle che non sono su ssl vengono passate a forceSSL, che provvede
ad indirizzare tutte le richieste su https://, quelle che invece provengono da https:// ma presentano dati alterati maliziosamente, vengono inviate a cakeError('accessDenied'). QUesta funzione presenta un messaggio d'errore personalizzabile. Vediamo come.
Nostra cartella app/ creaiamo un file app_error.php

<?php
class AppError extends ErrorHandler {
	public function accessDenied(){
		$name = array('name' => __('Your are a really bad guy...stay away from my app!', TRUE));
		$this->controller->set($name);
		$this->_outputMessage('goaway');
	}
}
?>

Poi, nella cartella app/views/errors creaiamo il nostro template goaway.ctp

<h2><?php echo $name ?></h2>

Abbiamo quindi predisposto la nostra applicazione ad essere accessibile solo su https:// e ad inviare le cattive richieste alla tal pagina. Per escludere un campo dal controllo del form da parte del Security component, dovremo disabilitarlo. Nell'esempio qui sotto, disabilito il confirm pwd in users_controller.php

function beforeFilter() {
	parent::beforeFilter();
		$this->Security->blackHoleCallback = 'invalid';
		$this->Security->disabledFields = array('User.confirmpassword');
}

Ultima cosa, per utilizzare ssl, dovete modificare la configurazione del vostro server. Nel caso utilizziate apache2+linux, questa è la guida giusta.
Se volete che il vostro sito sia raggiungibile sia da http che da https(come nel mio caso), ricordatevi che dovete avere due file nella vostra cartella sites-available, uno "miosito" e uno "miosito-ssl", quest'ultimo con "SSLEngine on", come ben descritto nella guida linkata.