Комментарии 20
1. mysql_exec("SELECT * FROM people WHERE name = ?", $name); - тут бы лучше сделать поддержку массива... может быть name = ? AND password = ?, да это уже реализовано в разных библиотеках
2. покажите мне где register_globals включен до сих пор?
3. с magic_quotes тоже самое что и с 2.
2. покажите мне где register_globals включен до сих пор?
3. с magic_quotes тоже самое что и с 2.
Спасибо, я посмотрю, что за такая библиотека. ;-)
это например реализовано в расширении mysqli (http://ru2.php.net/manual/en/ref.mysqli.…)
1.1 Можно и массивом.
1.2 Пример с "name = ?" всего лишь демонстрация.
1.3 Много кто "пишет с нуля". :-)
2. Попадаются такие хостеры.
3. Тоже что и 2.
1.2 Пример с "name = ?" всего лишь демонстрация.
1.3 Много кто "пишет с нуля". :-)
2. Попадаются такие хостеры.
3. Тоже что и 2.
Register_globals и magic_quotes легко отключаются в .htaccess:
php_flag magic_quotes_gpc Off
php_flag register_globals Off
php_flag magic_quotes_gpc Off
php_flag register_globals Off
А прочитать мануал не пробовали?
1) есть расширение mysqli (http://ru2.php.net/manual/en/ref.mysqli.…), в частности читать про mysqli_stmt
2) register_globals и magic_quotes - "This feature is DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged."
1) есть расширение mysqli (http://ru2.php.net/manual/en/ref.mysqli.…), в частности читать про mysqli_stmt
2) register_globals и magic_quotes - "This feature is DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged."
Код из пункта 2 работает не совсем правильно — не фильтрует переменные сессии.
Я использую для этих целей вот такой код:
if(ini_get('register_globals')) {
$superglobals = array($_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET);
if(isset($_SESSION)) array_unshift($superglobals, $_SESSION);
foreach($superglobals as $superglobal) {
foreach($superglobal as $global => $value) {
$GLOBALS[$global] = null; // This is NOT paranoid because
unset($GLOBALS[$global]); // unset may not work
}
}
@ini_set('register_globals', false);
} else {
/**
* Otherwise, just unset HTTP_*_VARS arrays
*/
$GLOBALS['HTTP_GET_VARS'] = $GLOBALS['HTTP_POST_VARS'] = $GLOBALS['HTTP_POST_FILES'] = $GLOBALS['HTTP_COOKIE_VARS'] = $GLOBALS['HTTP_SERVER_VARS'] = $GLOBALS['HTTP_ENV_VARS'] = null;
unset($GLOBALS['HTTP_GET_VARS'], $GLOBALS['HTTP_POST_VARS'], $GLOBALS['HTTP_POST_FILES'], $GLOBALS['HTTP_COOKIE_VARS'], $GLOBALS['HTTP_SERVER_VARS'], $GLOBALS['HTTP_ENV_VARS']);
}
Он, кроме того, очищает $HTTP_*_VARS массивы (они создавались в ранних версиях php, если включена какая-то там директива).
Я использую для этих целей вот такой код:
if(ini_get('register_globals')) {
$superglobals = array($_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET);
if(isset($_SESSION)) array_unshift($superglobals, $_SESSION);
foreach($superglobals as $superglobal) {
foreach($superglobal as $global => $value) {
$GLOBALS[$global] = null; // This is NOT paranoid because
unset($GLOBALS[$global]); // unset may not work
}
}
@ini_set('register_globals', false);
} else {
/**
* Otherwise, just unset HTTP_*_VARS arrays
*/
$GLOBALS['HTTP_GET_VARS'] = $GLOBALS['HTTP_POST_VARS'] = $GLOBALS['HTTP_POST_FILES'] = $GLOBALS['HTTP_COOKIE_VARS'] = $GLOBALS['HTTP_SERVER_VARS'] = $GLOBALS['HTTP_ENV_VARS'] = null;
unset($GLOBALS['HTTP_GET_VARS'], $GLOBALS['HTTP_POST_VARS'], $GLOBALS['HTTP_POST_FILES'], $GLOBALS['HTTP_COOKIE_VARS'], $GLOBALS['HTTP_SERVER_VARS'], $GLOBALS['HTTP_ENV_VARS']);
}
Он, кроме того, очищает $HTTP_*_VARS массивы (они создавались в ранних версиях php, если включена какая-то там директива).
зачем очищать HTTP_*, можно ведь их просто не использовать
Скачиваем вордпресс, открываем файл стартап.пхп и видим представленные автором примеры.
Кстати, там ещё очень много подобных (ммм, как вы там выразились...) фишечек
Кстати, там ещё очень много подобных (ммм, как вы там выразились...) фишечек
в php5 есть как минимум 2 библиотеки для работы с БД, которые позволяют использовать механизм плейсхолдеров, и еще кучу других возможностей, появившихся в современных БД.
это MYSQLI и PDO (php data objects). PDO - вообще является "фабрикой", так как поддерживает кучу БД, помимо MySQL.
насчет unregister_globals
подобный код встречал давно уже в некоторых CMS. в Mambo вроде...
щас уже думаю остались единицы разработчиков которые пользуют в приложениях $HTTP_*_VARS массивы. а вот вместо unset($GLOBALS[$name]); там в цикле можно проверять входные переменные на валидность и на присутствие атак(XSS,SQL inj...). чтоб ниже в приложение попадали гарантированно очищенные данные.
это MYSQLI и PDO (php data objects). PDO - вообще является "фабрикой", так как поддерживает кучу БД, помимо MySQL.
насчет unregister_globals
подобный код встречал давно уже в некоторых CMS. в Mambo вроде...
щас уже думаю остались единицы разработчиков которые пользуют в приложениях $HTTP_*_VARS массивы. а вот вместо unset($GLOBALS[$name]); там в цикле можно проверять входные переменные на валидность и на присутствие атак(XSS,SQL inj...). чтоб ниже в приложение попадали гарантированно очищенные данные.
НЛО прилетело и опубликовало эту надпись здесь
А как можно получить POST данные в первоначальном виде, а не в том, что с ним делает PHP, складывая в $_POST?
Конкретно что не нравится:
1. невозможно получить данных из не последних полей с одинаковыми именами, если не добавлено "[]" к имени, например
2. даже если использовать имя с квадратными скобками, то невозможно получить позицию поля среди других полей, если эти поля шли не подряд, например
Конкретно что не нравится:
1. невозможно получить данных из не последних полей с одинаковыми именами, если не добавлено "[]" к имени, например
<input name="item" value="1"><item name="item" value="2">
, будет получено лишь item=2;2. даже если использовать имя с квадратными скобками, то невозможно получить позицию поля среди других полей, если эти поля шли не подряд, например
<input name="item1[]" value="1"><input name="item2" value="2"><input name="item1[]" value="3">
- мы получим данные лишь так: item1[0]=1, item1[1]=3, item2=2Зарегистрируйтесь на Хабре, чтобы оставить комментарий
PHP'шные фишечки