@heiko dot richler at informatik dot fh-nuernberg dot de
I think your stripslashes_deep function should like this:
function stripslashes_deep(&$value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
You missed the References.
get_magic_quotes_gpc
(PHP 4, PHP 5)
get_magic_quotes_gpc — Obtiene el valor actual de configuración de la comillas mágicas gpc
Descripción
Devuelve el valor actual del parámetro de configuración magic_quotes_gpc
Tenga en cuenta que el parámetro magic_quotes_gpc no funcionará en tiempo de ejecución.
Para más información sobre magic_quotes, vea esta sección de seguridad.
Valores retornados
Devuelve 0 si las comillas mágicas están deshabilitadas, 1 de lo contrario.
Ejemplos
Example #1 Ejemplo de get_magic_quotes_gpc()
<?php
echo get_magic_quotes_gpc(); // 1
echo $_POST['apellido']; // O\'reilly
echo addslashes($_POST['apellido']); // O\\\'reilly
if (!get_magic_quotes_gpc()) {
$apellido = addslashes($_POST['apellido']);
} else {
$apellido = $_POST['apellido'];
}
echo $apellido; // O\'reilly
$sql = "INSERT INTO apellidos (apellido) VALUES ('$apellido')";
?>
Notes
Note: Si la directiva magic_quotes_sybase se encuentra habilitada (ON), sobrescribirá completamente magic_quotes_gpc. Así que aun cuando get_magic_quotes_gpc() devuelve TRUE, ni las comillas dobles, ni las barras invertidas o caracteres NUL serán escapados. Sólo las comillas sencillas serán escapadas. En este caso se verán de este modo: ''
get_magic_quotes_gpc
20-Apr-2008 09:28
15-Apr-2008 09:02
@ dot dot dot dot dot alexander at gmail dot com
I suggest replacing foreach by "stripslashes_deep":
Example #2 Using stripslashes() on an array on
<http://www.php.net/manual/en/function.stripslashes.php>:
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
This gives:
if ( (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc())
|| (ini_get('magic_quotes_sybase') && (strtolower(ini_get('magic_quotes_sybase'))!="off")) )
{
stripslashes_deep($_GET);
stripslashes_deep($_POST);
stripslashes_deep($_COOKIE);
}
09-Mar-2008 04:06
Just a little correction:
( Because of the ini_get function that may return a string value of "off" that evaluates to TRUE )
<?php
if(
( function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc() )
|| ( ini_get('magic_quotes_sybase') && ( strtolower(ini_get('magic_quotes_sybase')) != "off" ) )
){
foreach($_GET as $k => $v) $_GET[$k] = stripslashes($v);
foreach($_POST as $k => $v) $_POST[$k] = stripslashes($v);
foreach($_COOKIE as $k => $v) $_COOKIE[$k] = stripslashes($v);
}
?>
09-Mar-2008 03:51
If you don't need to enter the user input in a database, and you are annoyed by "those-damn-slashes-behind-the-apostrophes" (or quotes), that you are forced to strip manually for each entry, you will find this helpful: ( Just put it so it gets executed before any manipulation to the GPC ( Get|Post|Cookie ) )
<?php
if( ( function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc() ) || ini_get('magic_quotes_sybase') ){
foreach($_GET as $k => $v) $_GET[$k] = stripslashes($v);
foreach($_POST as $k => $v) $_POST[$k] = stripslashes($v);
foreach($_COOKIE as $k => $v) $_COOKIE[$k] = stripslashes($v);
}
?>
29-Dec-2007 06:37
If your Application checks if magic quotes gpc in on using this function, then you will get an undefined function in php6 as get_magic_quotes_gpc has been removed because magic quotes was removed in php6. so if MQ is off then it is safe to use a function that returns 0.
<?php
if(!function_exists('get_magic_quotes_gpc'))
{
function get_magic_quotes_gpc()
{
return 0;
}
}
?>
03-Jul-2007 05:19
The magic_quotes_gpc = On setting in php.ini is an unfortunate flaw in php which is not a convenience but a source of many bugs and a performance penalty. Decent programmers all know that special characters such as single quotes need to be escaped in string values of an SQL statement. The magic_quotes_gpc = On setting wants to do this for programmers but fails to realize that post or get data usually are validated first. If the data are not valid, they are sent back to the browser for resubmission. In this case, the slashes added to the data are doubled after the next submission, thus causing bugs.
06-Dec-2006 03:32
Re: php at kaiundina dot de (03-Feb-2005 02:18)
1. magic_quotes_gpc=on/off and magic_quotes_sybase=on/off
I made test and your function worked right.
These were the <input ... /> names I used:
name="a"
name="b.b b\b"
name="c[c.1]"
name="c[c 2]"
name="c[c\3]"
name="c.c c[c.' 4]"
name="c ' c[c"4]"
name="d"[d"1]"
(I used " because I don't know other way to put " into the name)
and the user-input value:
a ' " \ \' \" \\ a
2. > 17) The chars '.', ' ' are always replaced by '_' when used in keys.
This is true only for the top-level keys, such as "b.b b\b", "c.c c" and "c ' c" above. The second-level key "[c.' 4]" was not changed to [c_'_4] but was escaped acording to how magic_quites_XXX are set.
Tested on PHP 4.4.0.
These magic_quotes are really black magic :(
It'll be good to make test against $_SESSION, but I can't do it today.
11-Jul-2006 03:14
When you work with forms and databases you should use this concept:
1.When inserting the user input in DB escape $_POST/$_GET with add_slashes() or similar (to match the speciffic database escape rules)
$query='INSERT INTO users SET fullname="'.add_slashes($_POST['fullname']).'"';
insert_into_db($query);
2.When reading a previously submitted input from DB use html_special_chars to display an escaped result!
read_db_row('SELECT fullname FROM users');
echo '<input type="text" name="fullname" value="'.html_special_chars($db_row['fullname']).'" />
this way you safely store and work with the original(unescaped) data.
All the code listed on this page is not necessary if you use the php_flag directive in a .htaccess file. This allows you to disable magic quotes completely, without the need to adjust your php.ini file or (re)process the user's input.
Just take a look at http://www.php.net/manual/en/security.magicquotes.php#55935
Gist of his note: in the .htaccess file, add a line
php_flag magic_quotes_gpc off
That's it. Thank you very much, richard dot spindler :) !
03-Feb-2005 01:18
Escaping of key-strings in GPC-arrays behave different to the escaping of their values.
First I expected that keys in submitted gpc-arrays are never escaped.
Anyway. After I saw escaped keys, I assumed they're escaped according to the settings of magic quotes.
... it's even worse...
It took me over 2 days of testing to figure out the exact behavior and creating two functions (one for each php-version) that strips slashes reliably from any array submitted to a script. Hope this saves someones time and nerves.
The following is true for $_GET- and $_POST-arrays. I hope other arrays affected by magic quotes behave equally.
I did not test the behavior for cases where magic_quotes_sybase is set.
== legend for possible case combinations ==
Px = php version we're using
P4 = php 4.3.9
P5 = php 5.0.2
MQ = MagicQuotes GPC
+MQ = magic quotes enabled
-MQ = magic quotes disabled
TL = TopLevel key
+TL = key is on top level (i.e. $_GET['myKey'])
-TL = key is nested within another array (i.e. $_GET['myList']['myKey'])
AK = ArrayKey
+AK = the value of the key is another array (i.e. is_array($_GET['myKey']) == true)
-AK = the value is a normal string (i.e. is_string($_GET['myKey']) == true)
== legend for possible results ==
KE = KeyEscaping
+KE = control chars are prefixed with a backslash
-KE = key is returned as submitted and needn't to be stripped
VE = ValueEscaping (doesn't apply for array as value)
+VE = control chars are prefixed with a backslash
-VE = value is returned as submitted and needn't to be stripped
== here we go - the following rules apply ==
1) P4 +MQ +AK +TL --> -KE
2) P4 +MQ +AK -TL --> +KE
3) P4 +MQ -AK +TL --> -KE +VE
4) P4 +MQ -AK -TL --> +KE +VE
5) P4 -MQ +AK +TL --> -KE
6) P4 -MQ +AK -TL --> -KE
7) P4 -MQ -AK +TL --> -KE -VE
8) P4 -MQ -AK -TL --> -KE -VE
9) P5 +MQ +AK +TL --> -KE
10) P5 +MQ +AK -TL --> +KE
11) P5 +MQ -AK +TL --> +KE +VE
12) P5 +MQ -AK -TL --> +KE +VE
13) P5 -MQ +AK +TL --> -KE
14) P5 -MQ +AK -TL --> -KE
15) P5 -MQ -AK +TL --> +KE -VE
16) P5 -MQ -AK -TL --> +KE -VE
17) The chars '.', ' ' are always replaced by '_' when used in keys.
Example (rule 15):
When running under php 5.0.2 having magic quotes disabled, gpc-keys on top level containing strings are escaped while their associated values are not.
== The following function will strip GPC-arrays for php 4.3.9 ==
function transcribe($aList, $aIsTopLevel = true) {
$gpcList = array();
$isMagic = get_magic_quotes_gpc();
foreach ($aList as $key => $value) {
$decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
if (is_array($value)) {
$decodedValue = transcribe($value, false);
} else {
$decodedValue = ($isMagic)?stripslashes($value):$value;
}
$gpcList[$decodedKey] = $decodedValue;
}
return $gpcList;
}
== The following function will strip GPC-arrays for php 5.0.2 ==
function transcribe($aList, $aIsTopLevel = true) {
$gpcList = array();
$isMagic = get_magic_quotes_gpc();
foreach ($aList as $key => $value) {
if (is_array($value)) {
$decodedKey = ($isMagic && !$aIsTopLevel)?stripslashes($key):$key;
$decodedValue = transcribe($value, false);
} else {
$decodedKey = stripslashes($key);
$decodedValue = ($isMagic)?stripslashes($value):$value;
}
$gpcList[$decodedKey] = $decodedValue;
}
return $gpcList;
}
Usage:
$unstrippedGET = transcribe($_GET);
$unstrippedPOST = transcribe($_POST);
Maybe someone is willing to test those combinations for other php-versions and with magic_quotes_sybase set to 'on' - let me know.
Sorry for this huge amount of text, but its complete. I was unable to compress the the decision table more than this.
14-Jan-2005 05:51
I've found that, when working with Oracle (9i at least), you'll want to turn on magic_quotes_sybase. I've read elsewhere that others have had the same experience.
26-Nov-2004 11:58
Please note, that when magic_quotes_gpc is set not only $_POST, $_GET, $_REQUEST, $_COOKIE arrays values are slashed. Actually every string value in $GLOBALS array is slashed, ie. $GLOBALS['_SERVER']['PATH_INFO'] (or $_SERVER['PATH_INFO']).
