Хак редиректа внешних ссылок (роня 2.X) /
обновлено
---
Скрываем внешние ссылки с помощью редиректа на внутреннюю страницу, чтобы сделать бесполезным размещение спамерами ссылок на портале (в основном в комментариях).
Верен только для ссылок, размещенных посредством BB–кода и для ссылок на сайт пользователя, которую он указал в профиле.
---
Создаем новый пустой файл
/modules/system/cache/goodurl.php
Создаем в корне сайта файл
/go.php
с содержанием
PHP код:
<?php
include_once("./mainfile.php");
if (!empty($_GET['url'])) {
$url = strip_tags(base64_decode($_GET['url']));
if (myRefererCheck($errstr) == true) {
redirect_header($url, 5, _REDIRECT_LINK_ATTENTION);
}
exit();
}
?>
В файле
/language/russian/global.php
После строки
PHP код:
define("_START", "Первая");
Добавляем
PHP код:
define("_REDIRECT_LINK_ATTENTION", "Внимание! Вы перенаправляетесь на другой сайт.");
открываем файл
/class/module.textsanitizer.php
находим метод
rcxCodeDecode()
находим и меняем строку
PHP код:
$replacements[] = '<a href="\\2" target="_blank">\\3</a>';
На
PHP код:
$replacements[] = "\$this->checkGoodUrl('$2', '$3')";
А строку
PHP код:
$replacements[] = '<a href="http://\\2" target="_blank">\\3</a>';
На
PHP код:
$replacements[] = "\$this->checkGoodUrl('http://$2', '$3')";
После метода
rcxCodeDecode()
Т.е. после строк
Добавляем новый метод
PHP код:
function checkGoodUrl($url, $text, $clean_text = true)
{
$url = strip_tags($url);
if ($clean_text) $text = strip_tags($text);
$good_url = file_get_contents(RCX_ROOT_PATH . '/modules/system/cache/goodurl.php');
$rcx_parsed_url = parse_url(RCX_URL);
$parsed_link = parse_url($url);
if (preg_match('/' . preg_quote($rcx_parsed_url['host']) . '/is', $url) || preg_match('/' . preg_quote($parsed_link['host']) . '/is', $good_url)) {
$link_html = "<a href=\"" . $url . "\" target=\"_blank\">" . $text . "</a>";
} else {
$link_html = "<noindex><a rel=\"nofollow\" href=\"" . RCX_URL . "/go.php?url=" . base64_encode($url) . "\" target=\"_blank\">" . $text . "</a></noindex>";
}
return $link_html;
}
Открываем
/modules/system/admin/filter/language/russian/filter.php
и после
PHP код:
define("_AM_BADAGENTSCONTAIN","aaa\.bbb\.ccc соответствует агенту, содержащему aaa.bbb.ccc");
добавляем
PHP код:
define("_AM_GOODURL","Дружественные URL");
define("_AM_GOODURL_DESC","Cайты-исключения (дружественные сайты) на которые не ставиться редирект при преобразовании BB-кода в HTML ссылку");
открываем
/modules/system/admin/filter/filter.php
и меняем содержимое этого файла на
PHP код:
<?php
/**
*
* @ Copyright: Copyright (C) Farsus Design. All rights reserved.
* @ Package: ScarPoX / shortterm SPX
* @ Subpackage: RUNCMS
* @ License: http://www.gnu.org/copyleft/gpl.html GNU/GPL
*
*/
if ( $rcxUser->isAdmin($rcxModule->mid()) ) {
/**
* Description
*
* @param type $var description
* @return type description
*/
function filterMain($type='menu') {
if ($_POST['submit'] == _SUBMIT) {
filterSave($type);
}
rcx_cp_header();
OpenTable();
echo '<a href="admin.php?fct=filter"><h4>'._AM_FILTERSETTINGS.'</h4></a><br />';
include_once(RCX_ROOT_PATH."/class/rcxformloader.php");
$form = new RcxThemeForm('', "filterform", "admin.php?fct=filter", "post", true);
switch ($type) {
case 'badunames':
$badentries = file(RCX_ROOT_PATH.'/modules/system/cache/badunames.php');
if ( !empty($badentries) ) {
$value = '';
foreach ($badentries as $bad) {
$value .= trim($bad)."\n";
}
$value = trim($value);
}
$unames_tarea = new RcxFormTextArea(_AM_BADUNAMES."</b><br /><br />"._AM_ENTERUNAMES."<b>", "unames", $value, 10);
$form->addElement($unames_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'unames');
$form->addElement($op);
$form->display();
break;
case 'bademails':
$badentries = file(RCX_ROOT_PATH.'/modules/system/cache/bademails.php');
if ( !empty($badentries) ) {
$value = '';
foreach ($badentries as $bad) {
$value .= trim($bad)."\n";
}
$value = trim($value);
}
$emails_tarea = new RcxFormTextArea(_AM_BADEMAILS."</b><br /><br />"._AM_ENTEREMAILS."<b>", "emails", $value, 10);
$form->addElement($emails_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'emails');
$form->addElement($op);
$form->display();
break;
case 'badwords':
$badentries = file(RCX_ROOT_PATH.'/modules/system/cache/badwords.php');
if ( !empty($badentries) ) {
$value = '';
foreach ($badentries as $bad) {
$value .= trim($bad)."\n";
}
$value = trim($value);
}
$words_tarea = new RcxFormTextArea(_AM_BADWORDS."<br /><br /></b>"._AM_ENTERWORDS."<b>", "words", $value, 10);
$form->addElement($words_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'words');
$form->addElement($op);
$form->display();
break;
case 'badips':
$value = '';
$badentries = file(RCX_ROOT_PATH.'/modules/system/cache/badips.php');
if ( !empty($badentries) ) {
foreach ($badentries as $bad) {
$value .= trim($bad)."\n";
}
}
$add_ip = $_GET['add_ip'];
if (!empty($add_ip)) {
$value .= "#".preg_quote(trim($add_ip))."#\n";
}
$value = trim($value);
$ips_tarea = new RcxFormTextArea(_AM_BADIPS."</b><br /><br />"._AM_ENTERIPS."<br /><div class='rcxquote'>"._AM_BADIPSTART."<br />"._AM_BADIPEND."<br />"._AM_BADIPCONTAIN."<b></div>", "ips", $value, 10);
$form->addElement($ips_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'ips');
$form->addElement($op);
$form->display();
break;
case 'badagents':
$badentries = file(RCX_ROOT_PATH.'/modules/system/cache/badagents.php');
if ( !empty($badentries) ) {
$value = '';
foreach ($badentries as $bad) {
$value .= trim($bad)."\n";
}
$value = trim($value);
}
$agents_tarea = new RcxFormTextArea(_AM_BADAGENTS."</b><br /><br />"._AM_ENTERAGENTS."<br /><div class='rcxquote'>"._AM_BADAGENTSSTART."<br />"._AM_BADAGENTSEND."<br />"._AM_BADAGENTSCONTAIN."<b></div>", "agents", $value, 10);
$form->addElement($agents_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'agents');
$form->addElement($op);
$form->display();
break;
case 'goodurl':
$goodurl = file_get_contents(RCX_ROOT_PATH . '/modules/system/cache/goodurl.php');
$goodurl_tarea = new RcxFormTextArea(_AM_GOODURL."</b><br /><br />"._AM_GOODURL_DESC."</div>", "goodurl", $goodurl, 10);
$form->addElement($goodurl_tarea);
$submit_button = new RcxFormButton("", "submit", _SUBMIT, "submit");
$form->addElement($submit_button);
$op = new RcxFormHidden('op', 'goodurl');
$form->addElement($op);
$form->display();
break;
default:
echo '<ul><li><a href="admin.php?fct=filter&op=unames">'._AM_BADUNAMES.'</a></li>';
echo '<li><a href="admin.php?fct=filter&op=emails">'._AM_BADEMAILS.'</a></li>';
echo '<li><a href="admin.php?fct=filter&op=words">'._AM_BADWORDS.'</a></li>';
echo '<li><a href="admin.php?fct=filter&op=ips">'._AM_BADIPS.'</a></li>';
echo '<li><a href="admin.php?fct=filter&op=agents">'._AM_BADAGENTS.'</a></li>';
echo '<li><a href="admin.php?fct=filter&op=goodurl">'._AM_GOODURL.'</a></li></ul>';
break;
}
}
/**
* Description
*
* @param type $var description
* @return type description
*/
function filterSave($name) {
global $myts;
$rcx_token = & RcxToken::getInstance();
if ( !$rcx_token->check() ) {
redirect_header('admin.php?fct=filter&op=' . $name, 3, $rcx_token->getErrors(true));
exit();
}
if (!@is_writable(RCX_ROOT_PATH."/modules/system/cache/".$name.".php")) {
$errors[] = sprintf(_MUSTWABLE, RCX_ROOT_PATH."/modules/system/cache/$name.php");
return false;
}
$errors = array();
$filter = array();
$filtered = $myts->oopsNl2Br($myts->oopsStripSlashesGPC(trim($myts->stripPHP($_POST[$name]))));
$filter = explode("<br />", $filtered);
if (!$file = @fopen(RCX_ROOT_PATH."/modules/system/cache/$name.php", "w")) {
$errors[] = sprintf(_MUSTWABLE, RCX_ROOT_PATH."/modules/system/cache/$name.php");
} else {
$output = "";
foreach ($filter as $entry) {
$output .= $entry."\n";
}
if (fwrite($file, $output) == -1) {
$errors[] = sprintf(_NGWRITE, RCX_ROOT_PATH."/modules/system/cache/$name.php");
}
fclose($file);
}
if (count($errors) > 0) {
rcx_cp_header();
OpenTable();
echo '<a href="admin.php?fct=filter"><h4>'._AM_FILTERSETTINGS.'</h4></a><br />';
foreach ($errors as $er) {
echo $er."<br />";
}
} else {
redirect_header("admin.php?fct=filter&op=$name", 1, _UPDATED);
exit();
}
}
/**
* Description
*
* @param type $var description
* @return type description
*/
$op = !empty($_POST['op']) ? $_POST['op'] : $_GET['op'];
switch($op) {
case 'words':
filterMain('badwords');
break;
case 'ips':
case 'add_ip':
filterMain('badips');
break;
case 'unames':
filterMain('badunames');
break;
case 'emails':
filterMain('bademails');
break;
case 'agents':
filterMain('badagents');
break;
case 'goodurl':
filterMain('goodurl');
break;
default:
filterMain();
}
CloseTable();
rcx_cp_footer();
}
?>
---
Теперь нам надо сделать, чтобы через редирект шли ссылки на сайт пользователя, которое он указал в своем профиле (в комментариях, на форуме, в самом прфиле)
открываем файл
/modules/forum/class/class.forumposts.php
находим метод
showPost() и строку
PHP код:
$www_image = "<a href='".$poster->url()."' target='_blank'><img src='".$bbImage['www']."' alt='"._VISITWEBSITE."' target='_blank' /></a>";
и меняем ее на
PHP код:
$www_image = $myts->checkGoodUrl($poster->url(), "<img src='".$bbImage['www']."' alt='"._VISITWEBSITE."' target='_blank' />", false);
открываем файл
/class/rcxcomments.php
находим метод
showThreadPost() и строку
PHP код:
$www_image = "<a href='".$poster->getVar("url")."'><img src='".RCX_URL."/images/icons/www.gif' alt='"._VISITWEBSITE."' target='_blank' /></a>";
меняем на
PHP код:
$www_image = $myts->checkGoodUrl($poster->getVar("url"), "<img src='".RCX_URL."/images/icons/www.gif' alt='"._VISITWEBSITE."' target='_blank' />", false);
открываем файл
/userinfo.php
находим строку
PHP код:
echo "<a href='".$thisUser->getVar("url", "E")."' target='_blank'>".$thisUser->getVar("url")."</a>\n";
и меняем ее на
PHP код:
echo $myts->checkGoodUrl($thisUser->getVar("url"), "<img src='".RCX_URL."/images/icons/www.gif' alt='" . _US_WEBSITE . "' />", false) . "\n";
ОБЯЗАТЕЛЬНО! Открываем файл /robots.txt и после
добавляем
---
После этого заходим в админ-панель в настройки фильтров в раздел
«Дружественные URL» и заносим сайты, на которые редирект добавляться не будет.
Для ссылок на свой сайт редирект добавляться не будет по умолчанию, безотносительно к наличию его в «Дружественных URL»
---
Минус хака, что преобразования производятся с уже имеющимся текстом, а не на стадии добавления, но зато действует в рамках всего сайта.