Using pg_update() and pg_insert() without key validation is not secure!
You need to check which data pairs you get, and if you want to allow to updated this column.
Example:
You have a table with tree colums: username, password, userlevel.
Your users may change only their username, and their password but not their userlevel.
If you don't filter the keys in the request array, every user can now change his userlevel just by sending a POST Request with "userlevel=>100".
So if you don't check if the key are allowed in your request array you'll get serious sql injection vulnarabilities in your code.
pg_update
(PHP 4 >= 4.3.0, PHP 5)
pg_update — Modifie les lignes d'une table
Description
pg_update() modifie les lignes de la table table_name , qui vérifient la condition condition, et leur donne la valeur de data. Si options est spécifié, pg_convert() est appliqué à data avec les options spécifiées.
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Liste de paramètres
- connection
-
Une ressource de connexion PostgreSQL.
- table_name
-
Le nom de la table dans laquelle les lignes seront mises à jour.
- data
-
Un tableau dont les clés sont les noms des champs dans la table table_name , et où les valeurs sont les lignes correspondantes qui seront mises à jour.
- condition
-
Un tableau dont les clés sont les noms des champs dans la table table_name , et où les valeurs sont les conditions à remplir par les lignes pour être mises à jour.
- options
-
Toutes combinaisons de constantes parmi PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_EXEC ou PGSQL_DML_STRING. Si PGSQL_DML_STRING fait partie du paramètre options , alors la requête sera retournée.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec. Retourne une chaîne de caractères si PGSQL_DML_STRING est passé via le paramètre options .
Exemples
Exemple #1 Exemple avec pg_update()
<?php
$db = pg_connect ('dbname=foo');
$data = array('field1'=>'AA', 'field2'=>'BB');
// C'est sécuritaire, car $_POST est convertit automatiquement
$res = pg_update($db, 'post_log', $_POST, $data);
if ($res) {
echo "Les données ont été modifiées : $res\n";
} else {
echo "Problème dans les données utilisateur\n";
}
?>
pg_update
25-Jan-2008 09:24
13-Apr-2006 02:54
> Return Values
>
> Returns TRUE on success or FALSE on failure. Returns string if
> PGSQL_DML_STRING is passed via options.
I have found in my copy of PHP (version 4.4.0) that if you use the 'PGSQL_DML_STRING' option, the function does not execute any query. It merely returns the query which would have been executed.
Another thing I noticed, pg_update does not seem to make use of pg_trace (atleast in 4.4.0).
PS this isn't a bug report, just an explanation of some undocumented features I noticed. As the manual says, the function is still in development so this behaviour may differ from version to version.
14-Jun-2005 02:26
This function is similar to PEAR::DB's autoExecute() function, with the only difference being that the where clause is an array instead of a string.
Also, if you want to use your instance of the DB class with this function, you can reference the existing resource connection with $db->connection.
An example would be:
<?
pg_update($db->connection, $arr_update, $arr_where);
?>
