validar para metodos metodo mejor encriptar encriptación encriptacion desencriptar contraseñas contraseña php mysql security connection pdo

mejor - metodos de encriptacion para php



¿Por qué PDO imprime mi contraseña cuando falla la conexión? (4)

Debería tener display_errors = off en su PHP.ini de todos modos para evitar este problema. Los errores que revelan detalles como estos provienen de muchos lugares, además de PDO.

Sí, también debes tenerlo en un bloque try / catch.

También puede $pdo->setAttribute(PDO::ERRMODE_SILENT) , pero luego debe verificar los códigos de error manualmente en lugar de usar un bloque try / catch. Consulte http://php.net/manual/en/pdo.setattribute.php para obtener más constantes de error.

Tengo un sitio web simple donde establezco una conexión a un servidor Mysql usando PDO.

$dbh = new PDO(''mysql:host=localhost;dbname=DB;port=3306'', ''USER'', ''SECRET'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Tuve un poco de tráfico en mi sitio y se llegó al límite de conexión de los servidores, ¡y el sitio web arroja este error con mi contraseña PLAIN!

Error fatal: excepción no detectada ''PDOException'' con el mensaje ''SQLSTATE [08004] [1040] Demasiadas conexiones'' en /home/domain/html/index.php:xxx Stack trace: # 0 /home/domain/html/index.php (64): PDO -> __ construct (''mysql: host = loca ...'', ''USER'', ''SECRET'', Array) # 1 {main} arrojado en /home/domain/html/index.php en la línea 64

Irónicamente, cambié a PDO por razones de seguridad, así que esto realmente me sorprendió, porque este error exacto es algo que puedes provocar muy fácilmente en la mayoría de los sitios que usan inundaciones http simples.

Ahora he envuelto mi conexión en un bloque try / catch, ¡pero aún así creo que esto es catastrófico!

Soy nuevo en PDO y mi pregunta es: ¿qué debo hacer para considerar que es seguro? ¿Cómo establezco una conexión de una manera segura? ¿Hay otros agujeros de seguridad conocidos como este que tengo que tener en cuenta?


Ok, esto me hizo reír un poco, el uso de informes de errores es para fines de depuración, te permite encontrar y solucionar problemas rápidamente.

Cuando se encuentra dentro de un entorno en vivo, su servidor debe configurarse solo para el registro interno y no para la salida directa, por lo que básicamente deberá desactivar el resultado de los errores dentro de su php.ini .

display_errors = Off

Pero mientras estás dentro del entorno de prueba, esta pila es simplemente una herramienta para ayudarte y es configurable.

Cuando se producen errores dentro de un entorno en vivo, se registrarían, por lo que siempre debería verificar sus archivos de registro y luego corregirlos en consecuencia.

La gente puede especificar que puede administrar errores dentro de su aplicación PHP, pero por preferencias personales creo que esta es la manera incorrecta de hacerlo, configurar los archivos INI y config para su servidor web y MySQL / MsSQL dará como resultado una administración más aguda.

Si su aplicación es pública, también sería una buena idea manejar los errores dentro de la aplicación, ya que un gran porcentaje de los clientes puede estar en el alojamiento compartido y no tener acceso completo a las configuraciones del servidor.


Solución simple para atrapar PDOException lanzada por el constructor de PDO:

try { $dbh = new PDO(''mysql:host=localhost;dbname=DB;port=3306'', ''USER'', ''SECRET'',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); } catch (PDOException $e) { throw new Exception(''Could not connect to database''); }


Usamos nombres de usuario y contraseñas codificadas, y decodificamos aquellos en el constructor PDO, luego detectamos la excepción PDOException y lanzamos una nueva excepción PDOException con la excepción anterior, de modo que la traza solo mostrará el nombre de usuario y la contraseña codificados.

Una buena biblioteca de cifrado para PHP es: defuse / php-encryption

https://github.com/defuse/php-encryption

Código de ejemplo:

<?php class myPDOWrapper extends PDO { public function __construct(string $dns, string $encodedUser, string $encodedPassword) { try { parent::__construct($dns, $this->decodeFunction($encodedUser), $this->decodeFunction($encodedPassword), [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ] ); } catch (PDOException $exception) { throw new PDOException($exception->getMessage()); } } private function decodeFunction(string $encoded): string { return /Defuse/Crypto/Crypto::decrypt($encoded, $this->decodeKey()); } private function decodeKey(): /Defuse/Crypto/Key { static $key = null; if(null === $key) { $key = /Defuse/Crypto/Key::loadFromAsciiSafeString(getenv(''MY_PDO_DECODE_KEY'')); } return $key; } }