Pull to refresh

Comments 44

Баг проявляется при включенном magic_quotes_gpc

Вобщем-то переведу подробней: Даже если в конфиге указано, что директива включена — она не включается.
Спасибо, поправил.
Тогда это не баг, это фича :)
плюс один! я тоже это подумал первым делом
Да уж, да уж :))) Точно кто-то из девелоперов почесал репу и поставил if (ini_get(«magic_quotes_gpc») == «on») ini_set(«magic_quotes_gpc», «off»); чтобы неповадно было этот костыль юзать.
Ничего собственно и страшного =)
Даже хорошо, что эта опция не включается!
Давайте сначала суперсекретный чит-код, накроющий медным тазом все хостинги с версией PHP ниже 5.3, а уж потом… :)
бензопилу вам в руки и iddqd в помощь )))
+1, давно пора бы уже, юникода хочется нормального
Было бы неплохо, если нельзя было сделать register_globals = On
Ждите 6й… там и это есть
помоему какраз и хорошо получилось.
однозначно, это была фича!!! хватит бороться с этими кавычками On/Off — задолбало!
ну и за что его заминусовали? человек правильно говорит — из-за этих директив и рождается куча будло-кодеров…
Да нет, тут имхо обратная взаимосвязь, не из-за директив рождаются быдлокодеры, а из-за быдлокодеров вводят директивы :)
не знаю как было в истории, но я вижу что быдлокодеры пишут код дома — где все с этими директивами итд :) и тут бац — на хостинге уже не то… короче начинается ужас :) скрипты не работают, или работают, но не так как надо )
Ну тех кто вообще не знаком с такой вещью как sql-injection, а таких людей на самом деле немало :) — магические кавычки худо-бедно спасают, так что в какой-то степени она оправдывает свое существование. Насчет register_globals конечно ничего такого сказать нельзя, ну да она теперь и отключена по умолчанию.
Всегдя использую функцию httpRequest и не думаю что там на сервере стоит
function httpRequest($var, $def = null)
{
$res = null;
if (isset($_POST[$var])) $res = $_POST[$var];
elseif (isset($_GET[$var])) $res = $_GET[$var];
if (isset($res) && get_magic_quotes_gpc())
if (is_array($res))
foreach ($res as $key => $value)
$res[$key] = stripslashes($value);
else $res = stripslashes($res);
return isset($res)? $res: $def;
}
Что-то как-то очень замудрено :) По-моему проще тогда уж обертку сделать, а-ля:
class MagicWrapper extends ArrayObject {

	protected $data = array();

	public function __construct(&$data) {
		if(get_magic_quotes_gpc()) {
			$this->data = $data;
			$data = $this;
		}
	}

	public function offsetGet($name) {
		return $this->strip($this->data[$name]);
	}

	public function strip($data) {
		if(is_array($data)) {
			return array_map(array($this, 'strip'), $data);
		} elseif(is_string($data)) {
			return stripslashes($data);
		} else {
			return $data;
		}
	}

}
new MagicWrapper($_GET);
new MagicWrapper($_POST);

или при старте скрипта фильтровать все кавычки, а я лично остановился на том что отключаю оную директиву в .htaccess
Тьфу, кривая обертка :) В конструкторе вместо
$this->data = $data;

нужно вызывать родительский метод
parent::__construct($data);

а в offsetGet вместо
return $this->data[$name];

использовать
$this->strip(parent::offsetGet($name));

а то что-то я так и не определился, отнаследовался от готового объекта, а вместо логику стал писать как для реализации интерфейсов :)
function noMagic()
{
	if (get_magic_quotes_gpc())
	{
		if (!empty($_GET)) $_GET = stripMagicQuotes($_GET);
		if (!empty($_POST)) $_POST = stripMagicQuotes($_POST);
		if (!empty($_REQUEST)) $_REQUEST = stripMagicQuotes($_REQUEST);
		if (!empty($_COOKIE)) $_COOKIE = stripMagicQuotes($_COOKIE);
    }
}

function stripMagicQuotes($arr)
{
    foreach ($arr as $k => $v) {
        $arr[$k] = is_array($v) ? stripMagicQuotes($v) : stripslashes($v);
    }
    return $arr;
}

noMagic();


Или такой вариант.
Ну да, это я и имел в виду под «при старте скрипта фильтровать все кавычки», тут впринципе есть простор для обсуждений, с одной стороны обертка в виде функции или-же объекта будет фильтровать данные снова и снова, с другой обработка при старте чревата тем что понадобиться может только часть данных, а обработаны все равно будут все.
>>Решение — откатиться на PHP 5.2.6 или ожидать PHP 5.2.8.
правильно: Решение — откатиться на PHP 5.2.6 и ожидать PHP 5.2.8.
а еще правильнее: переписать код, чтоб работал с magic_quotes_gpc=off :)
Имелась в виду ошибка перевода.
Но вообще — предложенное вами решение более подходящее :)
Спасибо, поправил
Вот только в данном случае все решения основанные на if(get_magic_quotes_gpc()) будут не корректными, т.к. при включённом magic_quotes функция вернёт true, а stripslashes затем уберёт нужные слеши.
magic_quotes_gpc == ЗЛО
Все данные надо обрабатывать ручками =)
Правда ваша, бороться с SQL Injection нужно при формировании запроса к БД, а не получении POST/GET параметров
Мне кажется, вопрос о вреде magic_quotes_gpc уже давно решён на всех уровнях. Однако каждому надо высказать своё мнение об этом. Все комментарии в плюсах, но в самом деле что-нибудь полезное говорит редкий комментатор.
Большую часть комментариев можно заменить фразой «magic_quotes — зло».
Это даже не холивар — здесь только одно мнение. Иначе, как словесным поносом, это назвать сложно.
«Кто понял жизнь, тот не спешит» ©
отличный урок для того, кто гониться за самыми последними и свежими версиями продуктов.

Хотя, канешн очень не приятно, что такой баг пропустили…
Человек умирает. Обидно что такую оплошность при создании допустили. ;)
Холивара никто не хочет. Просто Руби всяко лучше. :)
1) Баги есть везде.
2) Рубе тормоз т.к. это не VM. Со второй версией будет лучше.
3) Пишите на питоне.
Согласен. В рельсах есть!
Sign up to leave a comment.

Articles