PDA

Просмотр полной версии : WoW TrueShots


HarpyWar
14.05.2010, 10:29
Сделал хостинг изображений для игроков WoW - http://trueshots.org
На него можно загружать скриншоты из игры World of Warcraft, которые сделаны через игру, путем нажатия кнопки PRINTSCREEN (все остальные изображения помечаются ненастоящими). Например, если отредактировать скрин фотошопом, то он будет ненастоящим.

Собственно, если изображение на нём, то можно быть уверенным, что оно настоящее :)
Этот хостинг может использоваться в качестве средства для подачи игроками жалоб на читеров, да и просто любые скрины, для которых должна быть уверенность, что они не модифицированы.

Админам серверов ещё предлагается связать свой игровой сервер wow с trueshots.org, и игроки смогут добавлять скриншоты под своими игровыми персами.
Если кого заинтересует, подробности по ссылкам:
http://trueshots.org/idea.php
http://trueshots.org/add_server.php


Если у пользователя русский язык в браузере, то отображается русский интерфейс. Для всех остальных - английский.


Прикладываю исходники, если кто-то захочет поставить у себя такой же хостинг. У них немного меньший функционал, но основную функцию загрузки и отображения скриншотов выполняют.
Требуется веб сервер, mysql, php5+ и свободное место для файлов-скринов.
Установка очень простая, 4 последовательных шага описаны в файле README.txt

Версия 1.1 - без аккаунтов
Версия 2.2 - с аккаунтами из базы сервера wow с личной галереей пользователя, и с общей галереей, где можно посмотреть все загруженные скриншоты; игроки сервера могут оставлять комменты к каждому скриншоту

Shadez
14.05.2010, 13:59
Во-первых, даже те скриншоты, которые сделаны принтскрином в игре, не заливаются)
Во-вторых, как сабж относится к RMDC? :)

HarpyWar
14.05.2010, 14:19
Во-первых, даже те скриншоты, которые сделаны принтскрином в игре, не заливаются)
Во-вторых, как сабж относится к RMDC? :)
Если не сложно, можешь отправить мне на мыло те скрины, которые не заливаются?) harpywar@gmail.com
Только они должны быть прямо из папки с игрой, не обработанные и не пересохраненные какой-нибудь прогой.

Ну это косвенно как-никак относится, поскольку может быть полезно админам/гмам серверов, которым игроки предоставляют скрины.

tempura
14.05.2010, 14:29
Ну это косвенно как-никак относится, поскольку может быть полезно админам/гмам серверов, которым игроки предоставляют скрины. Тогда его у себя ставить надо - то есть исходники получить, а не ссылку на сайт.

HarpyWar
14.05.2010, 15:09
Окей, мне не жалко) тему обновил, исходники приложил. Это я делал для своего сервера пару лет назад, но сейчас его уже нет, поэтому расположил у себя.

Просто если они в одном месте хостятся, имхо, удобнее. Ведь конкретно на вов сервер они не завязаны, да и место свободное не нужно тратить.

Lightunit
14.05.2010, 15:11
А можете описать принцип определения скриншота?
По названию, по частям или по какаим то данным. Если вас не затруднит:)

LordJZ
14.05.2010, 15:17
А можете описать принцип определения скриншота?
По названию, по частям или по какаим то данным. Если вас не затруднит:)Судя по коду, проверяются первые несколько байт файла.

Konctantin
14.05.2010, 15:20
function checkImage($content)
{
//шаблоны hex заголовков изображений wow
$hexheader=array
(
//начальный блок у любого изображения wow - 26 символов
"ff d8 ff e0 0 10 4a 46 49 46 0 1 1 0 0 1 0 1 0 0 ff db 0 43 0 6 4",
);

foreach ($hexheader as $value)
{
//если все символы шаблона совпадают с началом контента, то возвратить true
if (substr(str2hex($content),1,strlen($value))==$valu e) return true;
}

return false;
}

HarpyWar
14.05.2010, 15:26
Да, все предельно просто, и в то же время надежно :)

Konctantin
14.05.2010, 15:29
Интересно, что тут за информация хранится? как расшифровать этот участок:
ff d8 ff e0 0 10 4a 46 49 46 0 1 1 0 0 1 0 1 0 0 ff db 0 43 0 6 4

Lightunit
14.05.2010, 15:42
http://www.ffd8.org/ - может поможет с расшифровкой. С английским плохо знаком.
http://www.fileformat.info/info/unicode/char/FFE0/index.htm

HarpyWar
14.05.2010, 16:00
На самом деле, там можно и побольше байт с начала файла проверять. Но я не стал заморачиваться - там с какого-то места в некоторых скринах с разным разрешением они различаются.

2Lightunit
По ссылкам совсем не то)
По первой просто блог так называется, а по второй это символ цента в юникоде.

Да в общем это и неважно, что там за инфа. Я, кажется, в свое время смотрел, вов сохраняет скрины в одном из вариантов формата jpeg 2000.

kBaTT
18.05.2010, 19:00
не помешала бы страничка, где можно просмотреть все скриншоты.

tempura
18.05.2010, 20:16
А, кстати, да. Вот я зашел на страницу, вижу там форму загрузки и три случайных скрина. А мне надо свой найти, который я неделю назад отгрузил. Как? Есть какой-то функионал вывода галереи, лучше всего с разделением по дням-неделям-месяцам-годам?

HarpyWar
18.05.2010, 23:45
Я уже сделал регистрацию и часть функционала типа личной галереи. Хочу сделать для своего хостинга автоматическую закачку изображений на какой-нибудь сервис, типа imageshack, чтобы не заботиться о свободном месте. И ещё закачку любых изображений - не только вововских. Они будут помечаться ненастоящими.

Так же в ближайшие дни думаю сделать прогу-аплоадер (если ничто не собьет мои планы :)), чтобы правой кнопкой можно было нажать на любой файл у себя на компе и одним кликом загрузить на трушотс в свой акк. Это только для моего хостинга, там будет свой апи.
Вообще, это скорее, для себя, т.к. всегда хотел иметь подобную прогу для быстрой загрузки любых изображений в инет. У всех, которые находил, какой-то не тот функционал был, и долго было открывать..

trtw89
19.05.2010, 05:16
+1 за идею с галереей
может вместо новой регистрации можно использовать игровой аккаунт? вытаскивать данные с realmd->account?

tempura
19.05.2010, 08:25
Отличная идея! Сразу тебе и твой акк, и все скрины что с него сделаны - найти нужный будет несложно, даже если их с сотню будет - свои-то скрины кое-как, но помнишь.

HarpyWar
19.05.2010, 10:25
У меня своего сервера нет. Если подскажете ссылку на структуру таблицы с юзерами у мангоса, и php функцию для хеширования пароля, то могу сделать модификацию для мангоса :)

trtw89
19.05.2010, 10:50
https://mmfpm.svn.sourceforge.net/svnroot/mmfpm/trunk/

srv38
19.05.2010, 15:31
У меня своего сервера нет. Если подскажете ссылку на структуру таблицы с юзерами у мангоса, и php функцию для хеширования пароля, то могу сделать модификацию для мангоса :)


--
-- База данных: `realmd`
--

-- --------------------------------------------------------

--
-- Структура таблицы `account`
--

CREATE TABLE IF NOT EXISTS `account` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Identifier',
`username` varchar(32) NOT NULL DEFAULT '',
`sha_pass_hash` varchar(40) NOT NULL DEFAULT '',
`gmlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
`sessionkey` longtext,
`v` longtext,
`s` longtext,
`email` text,
`joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_ip` varchar(30) NOT NULL DEFAULT '0.0.0.0',
`failed_logins` int(11) unsigned NOT NULL DEFAULT '0',
`locked` tinyint(3) unsigned NOT NULL DEFAULT '0',
`last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`active_realm_id` int(11) unsigned NOT NULL DEFAULT '0',
`expansion` tinyint(3) unsigned NOT NULL DEFAULT '2',
`mutetime` bigint(40) unsigned NOT NULL DEFAULT '0',
`locale` tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_gmlevel` (`gmlevel`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Account System' AUTO_INCREMENT=7 ;


Хешируется sha1(USERNAME:PASSWORD);

LordJZ
19.05.2010, 15:39
Хешируется sha1(USERNAME:PASSWORD)

srv38
19.05.2010, 16:49
Пардон :), точно, просто никогда внимания не обращал.

kBaTT
19.05.2010, 17:21
HarpyWar, очень хочется узнать. Новые версии галереи будут для паблика? Или нет?
Очень понравилась эта галерея, можно сказать то, что искал, но без страницы списка скринов, чуть не так выглядит. :)

srv38
19.05.2010, 18:07
Паблик?, или Вы имели ввиду эмуляторов а не офа?, тогда наверно можно просто убрать проверку в 8-м (http://ru-mangos.ru/showpost.php?p=6435&postcount=8) посте.

HarpyWar
19.05.2010, 18:09
Залил версию 2.0 с аккаунтами от сервера Мангоса и личной галереей скринов.

kBaTT, я думаю, это последняя общедоступная версия (но мелкие баги подправлю, если будут). С моей версией это уже идет в разрез - слишком много будет отличий, и модифицировать обе мне будет сложно.

kBaTT
19.05.2010, 19:13
при попытке залогиниться и просмотре полного скриншота пишет:
There seems to have been a slight problem with our database, please try again later.

часть конфига:
$mysql_database="wow_trueshots"; // база данных

$table_shots="screenshots"; // таблица со скриншотами
$table_users="realmd"; // таблица wow аккаунтов

HarpyWar
19.05.2010, 19:17
Так база данных должна быть от мангоса, в ней должна быть таблица $table_users с уже готовыми аккаунтами. Вероятно, должно быть так:
$mysql_database="realmd"; // база данных

$table_shots="screenshots"; // таблица со скриншотами
$table_users="account"; // таблица wow аккаунтов

Для проверки запроса к бд можешь раскомментировать 14 строку в login.php

kBaTT
19.05.2010, 19:20
HarpyWar, извеняюсь за свою невнимательность =)
Спасибо, теперь работает.

HarpyWar
19.05.2010, 19:34
Ещё пару багов подправил, скриншоты других юзеров не отображались, и ссылки на пейджинг не правильные были для всех скриншотов. Перезалил.
kBaTT, тебе из нового архива можно заменить screenshots.php, index.php и config.inc.php

trtw89
19.05.2010, 21:19
MySQL Error:


Error in SQL query:

SELECT * FROM account WHERE password='9f4f375ab956cd34176ce8265755b681bf7f1ba2 ' LIMIT 1;

Error: Unknown column 'password' in 'where clause'
Error #: 1054
Filename: /wow/2/login.php

$mysql_host="localhost";
$mysql_username="root";
$mysql_password="123456";
$mysql_database="realmd"; // база данных mangos

$table_shots="screenshots"; // таблица со скриншотами
$table_users="account"; // таблица wow аккаунтов

картинки видны, логин не проходит

Shadez
19.05.2010, 21:27
а ничего, что хэш хранится в поле `sha_pass_hash`?

CruncH
19.05.2010, 21:31
`sha_pass_hash` varchar(40) а не `password`, поправте в коде запрос, и проблема должна исчезнуть

зы. не тестил сам проект вообще

HarpyWar
19.05.2010, 21:44
Действительно. В login.php надо заменить на 18 строке password на sha_pass_hash
Перезалил.

wk23
19.05.2010, 22:19
Интересно, что тут за информация хранится? как расшифровать этот участок:
ff d8 ff e0 0 10 4a 46 49 46 0 1 1 0 0 1 0 1 0 0 ff db 0 43 0 6 4
редакторы дописывают в заголовок свои метаданные, также могут отличатся используемые спецификации формата jpeg
00000000 FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 00 64 яШяа..JFIF.....d
00000010 00 64 00 00 FF EC 00 11 44 75 63 6B 79 00 01 00 .d..ям..Ducky...
00000020 04 00 00 00 3C 00 00 FF EE 00 0E 41 64 6F 62 65 ....<..яо..Adobe


00000000 FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 яШяа..JFIF......
00000010 00 01 00 00 FF DB 00 43 00 06 04 04 04 05 04 06 ....яЫ.C........
00000020 05 05 06 09 06 05 06 09 0B 08 06 06 08 0B 0C 0A ................
http://www.codenet.ru/progr/formt/jpeg_13.php

HarpyWar
16.06.2010, 22:23
Добавлена возможность привязять свой игровой сервер wow, и игроки смогут добавлять скриншоты под своими игровыми персами.
Если кого заинтересует, подробности по ссылкам:
http://trueshots.org/idea.php
http://trueshots.org/add_server.php


Решился и доделал таки аплоудер. Если никто не будет юзать, то по крайней мере для себя :)
Плюс теперь можно загружать на trueshots.org вообще любые изображения. Те что не из вова помечаются ненастоящими.
http://trueshots.org/uploader.php
http://trueshots.org/images/trueshots_uploader_action.gif

Hantet
15.07.2010, 23:00
Ув. HarpyWar, позволите ли Вы использовать ваши наработки в плане проверки подлинности изображений в моём баг-трекере (http://ru-mangos.ru/showthread.php?t=1684)?

HarpyWar
16.07.2010, 08:02
Ув. HarpyWar, позволите ли Вы использовать ваши наработки в плане проверки подлинности изображений в моём баг-трекере (http://ru-mangos.ru/showthread.php?t=1684)?Конечно, можно. Буду рад, если это принесет пользу).

kBaTT
19.07.2010, 06:15
неплохо было бы сделать комментарии, но я такое еще не осилил, кто нибудь поможет сделать? :)

HarpyWar
23.07.2010, 21:35
неплохо было бы сделать комментарии, но я такое еще не осилил, кто нибудь поможет сделать? :)Написал комменты, обновил в первом посте архив, версия 2.1.
Если будешь обновлять, необходимо добавить в бд таблицу "comments" (структура в inc/TABLES.sql) и заменить все файлы из нового архива.

kBaTT
25.07.2010, 17:51
обновился, но не отображает комментарии, точнее ошибка:
Call to undefined function Translate()
Посмотрел файл func.inc.php, не нашел функции.

HarpyWar
26.07.2010, 08:07
обновился, но не отображает комментарии, точнее ошибка:
Call to undefined function Translate()
Посмотрел файл func.inc.php, не нашел функции.

Добавь в inc/func.inc.php несколько функций. С ними должно работать.
// добавляет сообщение
function SetMessage($text)
{
SessionSetValue('message', $text);
}
// после получения сообщения, оно удаляется
function GetMessage()
{
if ($message = SessionGetValue('message'))
{
$output = '<div class="form_message">' . $message . '</div>';
SessionSetValue('message', false);
return $output;
}
return false;
}

// получить локализацию пользователя
function GetCurrentLocale()
{
global $locales;

// если в сессии есть локализация, то возвратить её
$lc = ( SessionGetValue('locale') ) ? SessionGetValue('locale') : CURRENT_LANG;

// если локализация найдена в списке
foreach ($locales as $k => $l)
if ($lc == $k)
return $lc;

// если не найдена - английский
return 'en';
}

// возвращает переведенную на текущий язык фразу
function Translate($phrase_id)
{
global $lang;

// если такая фраза есть - возвратить
if ( array_key_exists($phrase_id, $lang[GetCurrentLocale()] ) )
return $lang[GetCurrentLocale()][$phrase_id];

// если такая фраза есть на английском - возвратить её
if ( array_key_exists($phrase_id, $lang['en'] ) )
return $lang['en'][$phrase_id];

return false;
}

function POSTGetValue($name)
{
if (isset($_POST))
{
if (array_key_exists($name, $_POST))
return $_POST[(string)$name];
}
return false;
}

kBaTT
26.07.2010, 09:43
Warning: Invalid argument supplied for foreach() in /inc/func.inc.php on line 438
function GetCurrentLocale()
{
global $locales;

// если в сессии есть локализация, то возвратить её
$lc = ( SessionGetValue('locale') ) ? SessionGetValue('locale') : CURRENT_LANG;

// если локализация найдена в списке
foreach ($locales as $k => $l) //438 строчка
if ($lc == $k)
return $lc;

// если не найдена - английский
return 'en';
}
Как я вроде бы понял, он не находит существующую локализацию в сессии

HarpyWar
26.07.2010, 10:11
Да я там напутал че то... в моей версии уже все по-другому.

В config.inc.php добавь
$locales = array
(
'en' => "English",
'ru' => "Русский",

);
Когда у тебя заработает, я обновлю архив в 1 посте. Спс за тестирование)

kBaTT
26.07.2010, 10:16
HarpyWar, спасибо. Теперь все отлично работает :)

Muzhik
05.08.2010, 22:47
Пожелание автору. Я думаю было бы полезно сделать к примеру в левом блоке вывод последних скриншотов, а в правом вывод последних комментариев(Думаю это многие поддержат, так как будет видимость ответа на сообщения друг друга).

ObeDve
17.10.2010, 19:12
Безопасно-ли использование данного движка ? Интересно что скажут гуру php :)
Я о заливке всяких шеллов и т.п. через которые "хакеры-шмакеры" смогут делать что угодно.

leeas
27.10.2010, 04:11
<?php

// функция проверки изображения на валидность (защита от XSS-атак)
function verify_image ($file) {
// защита от Null-байт уязвимости PHP
$file = preg_replace('/\0/uis', '', $file);
// проверка изображения
$txt = file_get_contents($file);
if (preg_match('#&(quot|lt|gt|nbsp|amp);#i', $txt)) return false;
elseif (preg_match("#&\#x([0-9a-f]+);#i", $txt)) return false;
elseif (preg_match('#&\#([0-9]+);#i', $txt)) return false;
elseif (preg_match("#([a-z]*)=([\`\'\"]*)script:#iU", $txt)) return false;
elseif (preg_match("#([a-z]*)=([\`\'\"]*)javascript:#iU", $txt)) return false;
elseif (preg_match("#([a-z]*)=([\'\"]*)vbscript:#iU", $txt)) return false;
elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU", $txt)) return false;
elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU", $txt)) return false;
elseif (preg_match("#</*(applet|link|style|script|iframe|frame|frameset)[^>]*>#i", $txt)) return false;
return true;
}

?>


Если немного помогла :thank_you:

labor
02.10.2012, 10:42
Сори за некропост, автору спасибо!
Применили ваши скрипты и при игре на офф серверах :) Таким образом отсеиваем игроков с персонажами другой фракций :) Скоро допилем авторизацию через базу форума, а не realmd.

Еще раз огромное спасибо!

lovepsone
02.10.2012, 21:48
<?php

// функция проверки изображения на валидность (защита от XSS-атак)
function verify_image ($file) {
// защита от Null-байт уязвимости PHP
$file = preg_replace('/\0/uis', '', $file);
// проверка изображения
$txt = file_get_contents($file);
if (preg_match('#&(quot|lt|gt|nbsp|amp);#i', $txt)) return false;
elseif (preg_match("#&\#x([0-9a-f]+);#i", $txt)) return false;
elseif (preg_match('#&\#([0-9]+);#i', $txt)) return false;
elseif (preg_match("#([a-z]*)=([\`\'\"]*)script:#iU", $txt)) return false;
elseif (preg_match("#([a-z]*)=([\`\'\"]*)javascript:#iU", $txt)) return false;
elseif (preg_match("#([a-z]*)=([\'\"]*)vbscript:#iU", $txt)) return false;
elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU", $txt)) return false;
elseif (preg_match("#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU", $txt)) return false;
elseif (preg_match("#</*(applet|link|style|script|iframe|frame|frameset)[^>]*>#i", $txt)) return false;
return true;
}

?>


Если немного помогла :thank_you:

сделали бы через свитч кейс