с консолью хакера всё просто, если имеете представление о php вообще и о структуре livestreet
в index.php есть строчка
define ('SYS_HACKER_CONSOLE', false);
переключаете в true, перезагружаете страничку и жмете Ctrl+~
теперь в нужном экшене(в вашем случае ActionProfile) дампим нужную переменную
dump($sResult['collection']);
и в консоли смотрим вывод, на каком объекте затык.
Удобная штука для отладки, чтобы не травмировать народ var_dump. Но следует заметить, что используется она ТОЛЬКО для отладки (ибо при ее активации есть проблемы с ajax)
почему-то при написании слов в строку ничего не происходило (вываливался запрос с текстом «Hacking attempt»), с чего понял, что не передается в запрос параметр security_ls_key. Решилось так: (вместо скрипта, что перед формой)
Хех, вот создаешь файл в хуках и вешаешь перехваты на нужные акшины. Надеюсь из примера все понятно.
/classes/hooks/HookCloseSome.class.php
<?php
class HookCloseSome extends Hook {
public function RegisterHook() {
$this->AddHook('action_init_ActionBlog_before','Check',__CLASS__,0); //Закрываем блоги
$this->AddHook('action_init_ActionPeople_before','Check',__CLASS__,0); //Закрываем людей
}
public function Check() {
/**
* Проверяем авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddNoticeSingle($this->Lang_Get('need_authorization'),$this->Lang_Get('attention'));
Router::Action('login');
Router::getInstance()->ExecAction();
}
}
}
?>
Действительно, проблема в нарушении целостности данных в базе — имеются комменты, ссылающиеся на удаленные топики. Почему-то скрипт конвертации, на который была ссылка выше, мне не помог. Пришлось удалять комментарии к несуществующим топикам вручную:
delete from prefix_comment_online where target_id not in (select topic_id
from prefix_topic);
После этой операции и очистки кеша модуль прямого эфира заработал нормально.
Подозреваю, что надо бы ещё почистить таблицу prefix_comment, где тоже есть комментарии к несуществующим топикам, но пока не стал этого делать, потому что не вижу ни одного негативного проявления.
Пишу полностью что и как.
Открываем файл /classes/hooks/HookStatisticsPerformance.class.php
После
class HookStatisticsPerformance extends Hook {
public function RegisterHook() {
$this->AddHook('template_body_end','Statistics',__CLASS__,-1000);
Добавляем
$this->AddHook('topic_show','TopicShow');
Далее, после
public function Statistics() {
$oEngine=Engine::getInstance();
$iTimeInit=$oEngine->GetTimeInit();
$iTimeFull=round(microtime(true)-$iTimeInit,3);
$this->Viewer_Assign('iTimeFullPerformance',$iTimeFull);
$aStats=$oEngine->getStats();
$aStats['cache']['time']=round($aStats['cache']['time'],5);
$this->Viewer_Assign('aStatsPerformance',$aStats);
$this->Viewer_Assign('bIsShowStatsPerformance',Router::GetIsShowStats());
return $this->Viewer_Fetch('statistics_performance.tpl');
}
Добавляем
public function TopicShow($aParams) {
$oTopic=$aParams['oTopic'];
$oTopic->setCountRead($oTopic->getCountRead()+1);
$this->Topic_UpdateTopic($oTopic);
}
В шаблоне добавляем в topic.tpl или в topic_list.tpl
Проблема в не целостности базы, возможно она была MyISAM.
Конвертировать текущую 0.3.1 БД в нормальный целостный вид можно этим скриптом. Далее уже получившуюся БД конвертировать в 0.4.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
set_time_limit(0);
$conn1 = mysql_connect("localhost", "root", "");
$conn2 = mysql_connect("localhost", "root", "",true);
if (!$conn1) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}
if (!mysql_select_db("livestreet03",$conn1)) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
if (!mysql_select_db("livestreet03new",$conn2)) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
mysql_query("set character_set_client='utf8'",$conn1);
mysql_query("set character_set_results='utf8'",$conn1);
mysql_query("set collation_connection='utf8_bin'",$conn1);
mysql_query("set character_set_client='utf8'",$conn2);
mysql_query("set character_set_results='utf8'",$conn2);
mysql_query("set collation_connection='utf8_bin'",$conn2);
function buildInsertSql($sTable,$aRow) {
$sql='INSERT INTO '.$sTable.' SET ';
foreach ($aRow as $key => $value) {
if (!is_null($value)) {
$value="'".mysql_escape_string($value)."'";
} else {
$value='NULL';
}
$sql.=' '.$key."=".$value.",";
}
return trim($sql,',');
}
function exportTable($sTable) {
global $conn1;
global $conn2;
$iAll=0;
$iExp=0;
$res = mysql_query("SELECT * FROM {$sTable}",$conn1);
if ($res) {
while ($row = mysql_fetch_assoc($res)) {
if (@mysql_query(buildInsertSql($sTable,$row),$conn2)) {
$iExp++;
}
}
$iAll=mysql_num_rows($res);
mysql_free_result($res);
}
echo "Export {$sTable}: {$iExp} from {$iAll}\n";
}
//пользователи
exportTable('prefix_user');
exportTable('prefix_user_administrator');
exportTable('prefix_user_vote');
//блоги
exportTable('prefix_blog');
exportTable('prefix_blog_user');
exportTable('prefix_blog_vote');
//топики
exportTable('prefix_topic');
exportTable('prefix_topic_vote');
exportTable('prefix_topic_tag');
exportTable('prefix_topic_read');
exportTable('prefix_topic_question_vote');
exportTable('prefix_topic_content');
exportTable('prefix_topic_comment');
exportTable('prefix_topic_comment_vote');
exportTable('prefix_topic_comment_online');
//почта
exportTable('prefix_talk');
exportTable('prefix_talk_comment');
exportTable('prefix_talk_user');
//география
exportTable('prefix_city');
exportTable('prefix_city_user');
exportTable('prefix_country');
exportTable('prefix_country_user');
//остальное
exportTable('prefix_reminder');
exportTable('prefix_page');
exportTable('prefix_invite');
exportTable('prefix_friend');
exportTable('prefix_favourite_topic');
?>
Натолкнулся на то же самое под Fedora 12 с memcache 1.4.5.
В общем, дело там в том, что до версии 1.4.0 был необязательный аргумент, указывающий мемкешу сохранить удаляемый объект в кеше после операции удаления таким образом, чтобы новые объекты с тем же именем не могли быть добавлены. Эта опция была полностью удалена в 1.4.0, но сделано это было неправильно, из-за чего выкидывались ошибки при попытке использовать эту опцию. В 1.4.3 это было исправлено, ошибки больше не выбрасывались, но и опция не работала. В 1.4.4 в целях обеспечения обратной совместимости мемкеш стал обрабатывать задание таймаута 0 (немедленное удаление), при котором всё работало так, как надо. Однако, в Zend_cache это было исправлено только 10 марта 2010 года.
Итого, если работает неправильно, то:
в строке 190 файла /classes/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php
И еда в магазинах, тоже должна быть бесплатной, ведь она нужна всем!
Я придерживаюсь этого правила: «Нету денег — делай сам, есть деньги — пусть делают другие.»
Выход, собственно, прост. Не нужно отказываться от вики-разметки. Нужно её сделать понятной пользователю, вот и всё.
Приведу пример. Допустим, у вас есть поле для ввода, под ним перечислены непонятные теги, которые можно использовать. Не , а «ссылка на другую страницу» и так далее. Да и все доступные теги перечислять не надо, а только самые частоупотребимые. Посмотрите, как решили этот вопрос вконтакте (простигосподи).
А вообще в начале развития каждого проекта при нём должен быть администратор/менеджер/корректор, которые бы мониторил сайт и исправлял все недочёты и создавал вектор развития. Иначе бардак будет, каким бы хорошо организованным ни был контингент пользователей.
Вывод: пользователям минимальные необходимые средства для публикации в руки, остальное делает админ.
в index.php есть строчка
переключаете в true, перезагружаете страничку и жмете Ctrl+~
теперь в нужном экшене(в вашем случае ActionProfile) дампим нужную переменную
и в консоли смотрим вывод, на каком объекте затык.
Удобная штука для отладки, чтобы не травмировать народ var_dump. Но следует заметить, что используется она ТОЛЬКО для отладки (ибо при ее активации есть проблемы с ajax)
функция GetTopicsGood
видимо, заменить на
пробуйте
По сути в объект третьего параметра функции добавить
/classes/hooks/HookCloseSome.class.php
попробуй в файле Database.class.php после этих строк:
добавить вот такую строку
незабудь почистить кэш после всего этого.
После этой операции и очистки кеша модуль прямого эфира заработал нормально.
Подозреваю, что надо бы ещё почистить таблицу prefix_comment, где тоже есть комментарии к несуществующим топикам, но пока не стал этого делать, потому что не вижу ни одного негативного проявления.
Открываем файл /classes/hooks/HookStatisticsPerformance.class.php
После
Добавляем
Далее, после
Добавляем
В шаблоне добавляем в topic.tpl или в topic_list.tpl
у себя сделал suhosin.session.encrypt=off в php.ini, помогло
ошибка:
[Tue Jun 15 19:57:43 2010] [error] [client 207.46.195.232] ALERT — canary mismatch on efree() — heap overflow detected (attacker '20
7.46.195.232', file '/home/www/blog.***.ru/www/engine/include/function.php', line 318)
из всех логов появляется только в LiveStreet. IP и скрипт различаются, конечно.
config/config.php:
/**
* Настройки вывода блоков
*/
$config['block']['rule_index_blog'] = array(
'path' => array(
'___path.root.web___/blog$',
'___path.root.web___/blog/*$',
'___path.root.web___/blog/*/*$',
'___path.root.web___/index/*$',
'___path.root.web___/blog/*/*\.html$',
'___path.root.web___/blog/*\.html$',
'___path.root.web___/top$',
'___path.root.web___/top/*$',
'___path.root.web___/top/*/*$',
'___path.root.web___/my/*$',
'___path.root.web___/my/*/*$',
),
пропиши так, и глюка не будет...)
или я в чём-то не прав?)
Конвертировать текущую 0.3.1 БД в нормальный целостный вид можно этим скриптом. Далее уже получившуюся БД конвертировать в 0.4.
вот модуль для 0.3.1
Установка:
1. скопировать
2. настроить адрес в конфиге
3. доступ по адресу сайт/feedback
Условие использования:
бесплатно при условии сохранения копирайта.
стало:
В общем, дело там в том, что до версии 1.4.0 был необязательный аргумент, указывающий мемкешу сохранить удаляемый объект в кеше после операции удаления таким образом, чтобы новые объекты с тем же именем не могли быть добавлены. Эта опция была полностью удалена в 1.4.0, но сделано это было неправильно, из-за чего выкидывались ошибки при попытке использовать эту опцию. В 1.4.3 это было исправлено, ошибки больше не выбрасывались, но и опция не работала. В 1.4.4 в целях обеспечения обратной совместимости мемкеш стал обрабатывать задание таймаута 0 (немедленное удаление), при котором всё работало так, как надо. Однако, в Zend_cache это было исправлено только 10 марта 2010 года.
Итого, если работает неправильно, то:
в строке 190 файла /classes/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php
меняем на
после чего проблема исчезает.
Я придерживаюсь этого правила: «Нету денег — делай сам, есть деньги — пусть делают другие.»
define('SYS_MAIL_FROM_EMAIL','mydomain.com');
define('SYS_MAIL_FROM_NAME','mydomain.com');
define('SYS_MAIL_CHARSET','UTF-8');
define('SYS_MAIL_SMTP_HOST','tls://smtp.gmail.com');
define('SYS_MAIL_SMTP_PORT','465');
define('SYS_MAIL_SMTP_USER','user@mydomain.com');
define('SYS_MAIL_SMTP_PASSWORD','12345');
define('SYS_MAIL_SMTP_AUTH',true);
define('SYS_MAIL_INCLUDE_COMMENT_TEXT',true);
define('SYS_MAIL_INCLUDE_TALK_TEXT',true);
Приведу пример. Допустим, у вас есть поле для ввода, под ним перечислены непонятные теги, которые можно использовать. Не , а «ссылка на другую страницу» и так далее. Да и все доступные теги перечислять не надо, а только самые частоупотребимые. Посмотрите, как решили этот вопрос
А вообще в начале развития каждого проекта при нём должен быть администратор/менеджер/корректор, которые бы мониторил сайт и исправлял все недочёты и создавал вектор развития. Иначе бардак будет, каким бы хорошо организованным ни был контингент пользователей.
Вывод: пользователям минимальные необходимые средства для публикации в руки, остальное делает админ.