Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Форум имеет два адреса: 1. внешний, 2. ip-адрес внутрениий. В качестве base url прописан внешний.
Теперь модераторы по внутреннему адресу не могут модерировать, всё время выскакивает сообщение о неверном источники, временно нашел такое решение, закомментировать в файлах edit.php и delete.php:
if($is_admmod)
confirm_referrer('edit.php')
и соотвественно:
if($is_admmod)
confirm_referrer('delete.php')
Как я понял, это не единственная ошибка, будут еще и другие...
Как можно это элегантнее исправить?
добавить альтернативные адреса непосредственно в функцию confirm_referrer
это не элегантнее, но лучше чем отключать проверку вообще.
hcs
хм. попробую.
Добавлено 01.06.2007 15:01:10:
hcs
в каком файле эту функцию искать?
function confirm_referrer($script)
{
global $pun_config, $lang_common;if (!preg_match('#^'.preg_quote(str_replace('www.', '', $pun_config['o_base_url']).'/'.$script, '#').'#i', str_replace('www.', '', (isset($_SERVER['HT
TP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''))))
message($lang_common['Bad referrer']);
}
можно подсказать как это сделать?
Добавлено 01.06.2007 15:01:31:
так правильно?
код:
function confirm_referrer2($script)
{
global $pun_config, $lang_common;
$mybase_url = "";
if ((!preg_match('#^'.preg_quote(str_replace('www.', '', $pun_config['o_base_url']).'/'.$script, '#').'#i', str_replace('www.', '', (isset($_SERVER['HT
TP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')) ) ) and (!preg_match('#^'.preg_quote(str_replace('www.', '', $mybase_url).'/'.$script, '#').'#i', str_replace('www.', '', (isset($_SERVER['HT
TP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')) ))) ;
}
Редактировался kmb (2007-01-06 13:08:17)
Вопрос: Что там значит "and"
Насколько я знаю в PHP такого ключевого слова нет. Есть &&.
Это первое.
Второе. Я сталкивался со схожей проблемой - когда у форума было два адреса. Обошел я это на мой взгляд достаточно элегантно:
1. добавил переменную 'o_base_url2' в конфиг (в таблицу config).
2. функция confirm_referer стала такой:
function confirm_referrer($script)
{
global $pun_config, $lang_common;
$ref=$_SERVER['HTTP_REFERER'];
if (!$ref) $ref='';
$pat=pun_preg_quote($pun_config['o_base_url2'].'/'.$script);
if (!preg_match('#^'.$pat.'#i', $ref))
message($lang_common['Bad referrer']);
}
и еще добавил функцию (перед confirm_referer):
// Make sure that HTTP_REFERER matches $pun_config['o_base_url']/$script
// Symbols (,),[,],|,? are used as regexped, all others are quoted.
function pun_preg_quote($quote)
{
$pat=preg_quote($quote);
$a=array('\(','\)','\|','\?','\[','\]');
$b=array( '(', ')', '|', '?', '[', ']');
$pat=str_replace($a,$b,$pat);
return $pat;
}
3. в admin_option.php после
<th scope="row">Base URL</th>
<td>
<input type="text" name="form[base_url]" size="50" maxlength="100" value="<?php echo $pun_config['o_base_url'] ?>" />
<span>The complete URL of the forum without trailing slash (i.e. http://www.mydomain.com/forums). This <strong>must</strong> be correct in order for all admin and moderator features to work. If you get "Bad referer" errors, it's probably incorrect.</span>
</td>
</tr>
добавил
<tr>
<th scope="row">Forum referer confirmation </th>
<td>
<input type="text" name="form[base_url2]" size="50" maxlength="100" value="<?php echo $pun_config['o_base_url2'] ?>" />
<span>This URL is like above (maybe exact copy), but it can contain regexp symbols "[]()?|" for multiple forum domain acception (such as localhost or intranet address).</span>
</td>
</tr>
В результате этих манипуляций в опциях у нас будет возможность вводить адрес для конфирма. Старый адрес остается как бы "визуальный", официальный, а второй - в виде упрощенного regexp'а, для подтверждения.
Еще там имеется ссылка на конфирмейшн в misc.php во время отсылки сообщения пользователю через email. Этот момент я не прорабатывал.
У меня это поле равно (для примера) http://(10.8.109.242|localhost|127.0.0.1)/forum
Редактировался Dexus (2007-01-06 15:57:44)
Да, эта защита очень уж не кстати.
После мод реврайта перестали работать какие - либо правки вообще.
На самом деле confirm_referer - защита "от дурачка". Потому как любым псевдо-браузером (более менее продвинутый хакинг) можно подставить любого реферера и симулировать переход с нужной страницы.
ну в таком случае лучшим выходом будет убрать эту защиту, перенести всю админку в отдельный каталог и закрыть его через .htaccess
hcs
Мне тоже кажется, что перенос админки в отдельный каталог и закрытие его через authorization - наиболее грамотное решение.
Dexus
как это нет?? )) убрали что ли? ))) вроде есть...
честно сказать, мне моё решение больше нравиться, правда пока не знаю работает или нет...
щас смотрю, и думается мне мне надо and на or поменять...
kmb
В php нет ни or ни and. Не глупи.
в пыхе действительно нет ключевых слов "АND" и "OR"
а конструкции типа:
$fd = fopen(...) or die(...)
?
тут есть
вы еще скажите про
$fd = fopen(...) and die(...)
Просто товарищ kmb видимо дельфист.
Редактировался Dexus (2007-01-07 21:50:16)
ну тада вам сюда - http://ru2.php.net/manual/ru/language.o … ogical.php
или посмотрите PHP core language keywords в гугле
Смысл двух разных вариантов для операторов "and" и "or" в том, что они работают с различными приоритетами
Это для тех, видимо, кто забыл как пользоваться скобками. Однако очень хорошо шарит в приоритетах...
Честно говоря этот идиотизм в PHP для меня новость.
Смысл двух разных вариантов для операторов "and" и "or" в том, что они работают с различными приоритетами
Это для тех, видимо, кто забыл как пользоваться скобками. Однако очень хорошо шарит в приоритетах...
Честно говоря этот идиотизм в PHP для меня новость.
не очень понял, почему это "идиотизм" мне например чем && удобнее применять and или вместо || применять or, имхо более понятнее, если кто-то чужой будет в коде разбираться и при этом особо программировать не умеет
Добавлено 01.10.2007 12:01:08:
и как это может быть новостью, если это существует с самого начала пхп в любой книжке по пхп это будет написано
kmb
Обыкновенно. Я воспринимаю PHP как синтаксически аналогичный C/Java (он изначально так и позиционирвоался). А там, разумеется, никаких and/or нет. И нарушать синтакчического единообразия (php/java) совсем не собираюсь. Если применять and/or, тогда уж и then и begin/end впридачу
Dexus
вообще-то в с++ есть операторы and и or, а значит и си они быть должны про яву ничего сказать не могу
Добавлено 01.10.2007 17:01:54:
для интереса посмотрел в гугле, они и в Джаве есть без них ни куда
kmb
Я вообще-то про сам язык говорю, а не библиотеки где делаются #define and && и #define or ||
дефайнами в си и не только or/and можно состряпать.
И в JavaSctipt нет ни or ни and.
Не надо шокировать программистов еретическими воззрениями
Не надо шокировать программистов еретическими воззрениями
Гы
Короче я вас тут послушал и сделал вывод что pascal рулит определенно (сначала я подумал про васик, но слава богу вовремя передумал)
pascal устарел. щас какбы рулит питон