note 116536 deleted from book.pdo by sobak
| From: | sobak@php.net | Date: | Fri, 02 Dec 2016 03:57:47 +0000 |
| Subject: | note 116536 deleted from book.pdo by sobak | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-207927@lists.php.net to get a copy of this message | ||
Note Submitter: Padre Cedano
----
Hola,
Sólo quiero señalar que cuando usamos la clase PDO, si hay un error, en el log se mostrará
la contraseña de nuestra base de datos, lo cual serÃa bastante peligroso, porque la misma
queda expuesta.
Investigando he encontrado una clase llamada "SafePDO" que impide esto:
//http://www.deiverbum.org/SafePDO.txt
<?php
/*
--http://php.net/manual/en/pdo.connections.php
// Connect to the database with defined constants
$dbh = new SafePDO(PDO_DSN, PDO_USER, PDO_PASSWORD);
*/
Class SafePDO extends PDO {
public static function exception_handler($exception) {
// Output the exception details
die('Uncaught exception: '. $exception->getMessage());
}
public function __construct($dsn, $username='', $password='',
$driver_options=array()) {
// Temporarily change the PHP exception handler while we . . .
set_exception_handler(array(__CLASS__, 'exception_handler'));
// . . . create a PDO object
parent::__construct($dsn, $username, $password, $driver_options);
// Change the exception handler back to whatever it was before
restore_exception_handler();
}
}
?>
Para usarla hay que crear un archivo PHP llamado por ejemplo SafePDO con el contenido del archivo
citado más arriba.
Y en cuando tengamos que conectar a nuestra base de datos:
<?php
include_once('SafePDO.php' );
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8';
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
);
$pdo = new SafePDO($dsn,DB_USER,DB_PASSWORD);
?>