Daniel Segovia

Blog personal

Archive for the ‘5.6 PHP y Oracle’ Category

Seguridad en los parámetros

Hacer un comentario

La seguridad en los parámetros es un concepto muy viejo pero es muy efectivo.
Los ataques SQL Injection son más comunes de lo que uno piensa, por ende las cadenas de texto (SQL) que enviamos al motor de la base de datos deben, como mínimo, prevenir este tipo de ataques.
La forma más común en estos ataques es cuando ingresamos valores externos a nuestro código a la base de datos, es decir un parámetro que venga por POST o GET.

Sí enviamos el siguiente query a la base

<?php
$query = "SELECT * FROM personas WHERE id = 5";
//envio el query
?>

no existe tal SQL Injection por que id = 5 será siempre id = 5 ya que esta embebido en nuestro código.

Un ejemplo diferente con una vulnerabilidad visible es el siguiente.

<?php
$query = "SELECT * FROM personas WHERE id = " . $_GET['id'];
//envio el query
?>

en este caso debemos prevenir que $_GET['id'] no contenga ningún código malicioso.

Cuando trabajamos con bases de datos Oracle tenemos a nuestro disposición la función oci_bind_by_name que realizará un blindaje sobre los parámetros, un metodología similar a stmt de mysqli.

<?php
$conn = oci_connect("usuario", "contraseña", "localhost/XE");
if (!$conn) {
    $m = oci_error();
    trigger_error(htmlentities($m['message']), E_USER_ERROR);
}
 
$sql = 'SELECT id,nombre,apellido FROM personas WHERE id = :id';
$stid = oci_parse($conn, $sql);
$id = $_GET['id'];
oci_bind_by_name($stid, ':id', $id);
oci_execute($stid);
$fila = oci_fetch_array($stid, OCI_ASSOC);
print_r($fila);
 
oci_free_statement($stid);
oci_close($conn);
?>

Written by Daniel Segovia

diciembre 1st, 2011 at 4:35 pm

Recuperar el contenido desde Oracle

Hacer un comentario

oci_fetch_array es la función que usaremos para transformar la fila de base de datos en array para tenerlo disponible y poder imprimirlo o procesarlo donde querramos

<?php
 
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
 
$stid = oci_parse($conn, 'SELECT id, nombre FROM personas');
oci_execute($stid);
 
while (($row = oci_fetch_array($stid, OCI_BOTH))) {
    // El array asociativo poseerá los índices en mayúsculas
    echo $row['ID'] . " - " . $row['NOMBRE'] . "\n<br/>";
}
 
oci_free_statement($stid); //libero la memoria
oci_close($conn); //cierro la conexión
 
?>

Written by Daniel Segovia

noviembre 29th, 2011 at 6:11 pm

ABM desde PHP a Oracle

Un comentario

Como en otras secciones del libro, mysql, sqlite y Microsoft SQL Server, para realizar un ABM necesitamos tener el código SQL correcto para enviarlo a la base de datos a través de una función que nos provee PHP, la función especifica para Oracle es oci_execute, pero para ejecutarla primero debemos preparar la cadena de texto SQL con oci_parse

<?php
//alta.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "INSERT INTO mitabla (columna) VALUES ('valor')";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>
<?php
//baja.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "DELETE FROM mitabla id = 10";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>
<?php
//modificacion.php
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
$query = "UPDATE mitabla set columna='otro valor' WHERE id = 5";
$stid = oci_parse($conn, $query);
oci_execute($stid); // La fila es comiteada y quedará disponible para todos los usuarios
?>

Written by Daniel Segovia

noviembre 29th, 2011 at 1:08 pm

Posted in 5.6.3 ABM

Conectar a Oracle desde PHP

Hacer un comentario

PHP nos ofrece 2 posibilidad para conectarnos a Oracle

php_oracle
Es una librería un tanto antigua pero es una muy buena opción sí no deseamos trabajar con datos tipo BLOB o CLOB.

php_oci8
Librería que permite conectarse a Oracle Database desde la versión 8.0 y posteriores. Posee muchas más funciones y funciona con BLOB y CLOB.

Usaremos oci8 a lo largo de esta sección, para conectarnos lo haremos con la función oci_connect

<?php
// Conectandose al servicio "XE" sobre la dirección "localhost"
$conn = oci_connect('usuario', 'contraseña', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
echo 'Conectado';
?>

Written by Daniel Segovia

noviembre 21st, 2011 at 5:12 pm

Introducción a Oracle desde PHP

Hacer un comentario

OCI8 nos brinda una serie de funciones para trabajar con bases de datos Oracle 11g, 10g, 9i y 8i. Soportan sentencias SQL y PL/SQL. Incluyen transacciones, marcadores de posición oracle, LOB, colecciones, escalabilidad de la base de datos Oracle, agrupamiento de conexiones residentes o Resident Connection Pooling (DRCP) y el almacenamiento en cache de resultados

La página oficial de Oracle posee un manual de PHP y Oracle
Link directo al manual

Written by Daniel Segovia

noviembre 15th, 2011 at 5:51 pm