Pull to refresh

Comments 20

1. mysql_exec("SELECT * FROM people WHERE name = ?", $name); - тут бы лучше сделать поддержку массива... может быть name = ? AND password = ?, да это уже реализовано в разных библиотеках
2. покажите мне где register_globals включен до сих пор?
3. с magic_quotes тоже самое что и с 2.
на hc.ru включено magic_quotes, правда простым .htaccess отключается
placeholder(заполнители) отличная защита от SQL инъекций сам уже достаточно давно их использую. Работа с placeholder'ами отлично реализована в библиотеке DBSimple Дмитрия Котерова.
Спасибо, я посмотрю, что за такая библиотека. ;-)
Только оно мало где установлено.
1.1 Можно и массивом.
1.2 Пример с "name = ?" всего лишь демонстрация.
1.3 Много кто "пишет с нуля". :-)
2. Попадаются такие хостеры.
3. Тоже что и 2.
Это я devilmaydie, недавно на Хабре, так сказать. :-)
Register_globals и magic_quotes легко отключаются в .htaccess:
php_flag magic_quotes_gpc Off
php_flag register_globals Off
Ну если скрипт расчитан на массовое использование, в том числе и на бесплатных хостингах, то, думаю, на .htaccess полагаться не стоит.
Это слишком сильное условие. Получается, и mod_rewrite лучше не использовать?
А прочитать мануал не пробовали?
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, если включена какая-то там директива).
зачем очищать HTTP_*, можно ведь их просто не использовать
Это код из моей CMS. Очищаю, чтобы разработчики модулей не писали корявого кода.
Для своего собственного проекта, конечно, проще их не использовать.
а, я понял.
мы пишем систему, к которой кто-то может писать плагины.
и если у них кривые руки, чтобы не пользовались тем, чем не надо.
Согласен
Скачиваем вордпресс, открываем файл стартап.пхп и видим представленные автором примеры.
Кстати, там ещё очень много подобных (ммм, как вы там выразились...) фишечек
в php5 есть как минимум 2 библиотеки для работы с БД, которые позволяют использовать механизм плейсхолдеров, и еще кучу других возможностей, появившихся в современных БД.
это MYSQLI и PDO (php data objects). PDO - вообще является "фабрикой", так как поддерживает кучу БД, помимо MySQL.

насчет unregister_globals
подобный код встречал давно уже в некоторых CMS. в Mambo вроде...
щас уже думаю остались единицы разработчиков которые пользуют в приложениях $HTTP_*_VARS массивы. а вот вместо unset($GLOBALS[$name]); там в цикле можно проверять входные переменные на валидность и на присутствие атак(XSS,SQL inj...). чтоб ниже в приложение попадали гарантированно очищенные данные.
UFO just landed and posted this here
А как можно получить POST данные в первоначальном виде, а не в том, что с ним делает PHP, складывая в $_POST?

Конкретно что не нравится:
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
Sign up to leave a comment.

Articles