Архив рубрики: Обновления

Grand Forum 2 [BETA] безопастность .

В файлах , которые отвечают за создание форумов и категорий есть дыры , которые не обходимо закрыть . Не достаточная фильтрация данных , таким оброзом можно в названии категории или в описание форума выставить форму для загрузки шелла . Пофиксить легко , достаточно дописать фильтрацию htmlspecialchars() на вывод названия и описания форумов и так же на название категорий .

В Архиве пофиксенные файлы ! forum_fix

Продвинутый профиль пользователя ( by merdox )

В сети уже давно скитается эта модификация с не доработками , но бесплатно . В принципе функционал отличный , хотя имеет ряд неисправностей якобы оставлены специально автором против барыг . Они весьма не критичны , за исключением одной ! Есть дырочка , через которую можно просто поснимать всем пользователям бонусы , и никто не заподозрит Вас в этом злодеянии . Все весьма просто и не составит особого труда навредить конкуренту у которого стоит данный мод . Сделать это можно путем правкой исходника , например через тот же самый Firebug !
Заходим в профиль пользователя , открываем исходник страницы, ищем код кнопки и меняем значение в минус . Как ни странно при нажатии кнопки , у жертвы со счета снимаются бонусы . Таким образом можно опустить на бонусы всю Администрацию и пройтись по пользователям .

Для того что бы предотвратить сие злодеяние , в файле present.php добавляем строку проверки —

     if ($amount<10 || $amount>100)
	die("Бонусы в минус ?? Запрещено !)");

Сразу после :

    if ($from == $to)
        die("Вы не можете дарить бонусы себе.");

Вот и все !
Автор находки и багфикса — VictoRD11

Правильное определение IP из под прокси !

В стандартном движке функция getip() не определят реальный IP если кто то заходит на сайт под прокси .

Вот маленький багфикс ,  который будет передавать верный IP из переменной $_SERVER[‘HTTP_X_FORWARDED_FOR’] .

function getip() {
		if(!empty($_SERVER['HTTP_CLIENT_IP'])) {
			$ip_address = $_SERVER['HTTP_CLIENT_IP'];
		} else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
		} else if(!empty($_SERVER['REMOTE_ADDR'])) {
			$ip_address = $_SERVER['REMOTE_ADDR'];
		} else {
			$ip_address = '';
		}
		if(strpos($ip_address, ',') !== false) {
			$ip_address = explode(',', $ip_address);
			$ip_address = $ip_address[0];
		}
   return $ip_address;
 }

Багфикс — Кукис , для домена с www и без .

Наверное некоторые заметили , что при входе на сайт — www.site.ru и потом при переходе на site.ru надо было логиниться снова .
То есть система выставляла куки , для одного домена , через который вы логинитесь . Ваще не круто и пользователям приходилось объяснять что и как , бла бла бла …

Фиксим эту хрень следующим способом . Находим в файле include/functions.php функцию —

function logincookie($id, $passhash, $updatedb = 1, $expires = 0x7fffffff) {
 
	$subnet = explode('.', getip());
	$subnet[2] = $subnet[3] = 0;
	$subnet = implode('.', $subnet); // 255.255.0.0
 
	setcookie(COOKIE_UID, $id, $expires, '/');
	setcookie(COOKIE_PASSHASH, md5($passhash.COOKIE_SALT.$subnet), $expires, '/');
 
	if ($updatedb)
		sql_query('UPDATE users SET last_login = NOW() WHERE id = '.$id);
}

и функцию

function logoutcookie() {
//	setcookie(COOKIE_UID, '', 0x7fffffff, '/'); // Не стоит убирать комментирование т.к небудет работать система анти-двойной реги
	setcookie(COOKIE_PASSHASH, '', 0x7fffffff, '/');
}
?

заменяем их на —

function logincookie($id, $passhash, $updatedb = 1, $expires = 0x7fffffff) {
 
		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
 
	$subnet = explode('.', getip());
	$subnet[2] = $subnet[3] = 0;
	$subnet = implode('.', $subnet); // 255.255.0.0
 
	setcookie(COOKIE_UID, $id, $expires, '/',$domain);
	setcookie(COOKIE_PASSHASH, md5($passhash.COOKIE_SALT.$subnet), $expires, '/',$domain);
 
	if ($updatedb)
		sql_query('UPDATE users SET last_login = NOW() WHERE id = '.$id);
}

и функцию

function logoutcookie() {
 
		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
 
 
//	setcookie(COOKIE_UID, '', 0x7fffffff, '/',$domain); // Не стоит убирать комментирование т.к небудет работать система анти-двойной реги
	setcookie(COOKIE_PASSHASH, '', 0x7fffffff, '/',$domain);
}
?

Что добавилось —

		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains

Функция , которая определяет домен с которого производиться попытка входа в систему , далее она обрезает www и выставляет домен в виде — .site.ru ! Имена с такой формой домена , кукис будут работать для доменов www.site.ru и site.ru .
Далее , полученный домен .site.ru присваиваем к кукам — $domain .

Могут быть проблемы с выходом с сайта для тех пользователей кто уже зологинлся по старой функции , так что просто попросите их удалить куки .

Для тех кто использует Grand Forum 2[beta]

Поправте у себя файлик форума !!!

Ищите —

$keywords = (isset($_GET['keywords']) ? trim($_GET['keywords']) : '');

после вставить —

$keywords = htmlspecialchars($keywords);

Вставить надо в двух местах .

Убирает всякие XSS и тому подобные .