altjo |
Отправлено: 29 июля 2009 — 17:26
|
ExBB Skins Creator
Покинул форум
Сообщений всего: 277
Дата рег-ции: Февр. 2009
Репутация: 86
|
Извиняюсь, если не туда, возможно, пишу... собственно хотелось бы прикрепить captcha к гостям...
Скажите плиз, как определить залогинился ли пользователь, или он гость?... =>
пока это виглядит так
post.php
сразу после
CODE:if ($fm->input['action'] == 'addnew' || $fm->input['action'] == 'addreply') {
вставил
CODE:if (!defined('IS_ADMIN')) {
if ($fm->input['captcha'] == '' || !isset($_SESSION['captcha']) || $fm->input['captcha'] !== $_SESSION['captcha']) {
$fm->_Message('Защита от спама', 'Неверный код.');
}
}
post_addnew.tpl
добавил
CODE:if (!defined('IS_ADMIN')) {
echo <<<DATA
<tr>
<td class="row4"><img src="regimage.php" border="0" alt="captcha"></td>
<td class="row4"><input type="text" style="width: 130px" name="captcha" size="13" maxlength="10"></td>
</tr>
DATA;
}
при создании новой темы появляется защитный код
для админа идет проверка CODE:if(!defined('IS_ADMIN')) , а как для прочих зарегистрированных пользователей проверить?
можно вроде через $_spam_msgs, но хотелось бы чтобы зарегистрированным юзверям код не показывался...
пробовал так
CODE:if (!(defined('IS_ADMIN') || defined('IS_LOGIN'))) {
но не работает (
Заранее благодарен...(Отредактировано автором: 29 июля 2009 — 17:28) |
|
|
yura3d |
Отправлено: 29 июля 2009 — 18:05
|
ExBB Team ExBB Developer ExBB Mods Author
Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009
Откуда: Минск, Беларусь
Репутация: 353
|
altjo пишет:а как для прочих зарегистрированных пользователей проверить?
Нужно проверять значение $fm->user['id'], это id зарегистрированного пользователя. Для гостей это значение равно нулю. Ваше выражение выше:
CODE:if (!defined('IS_ADMIN')) {
if ($fm->input['captcha'] == '' || !isset($_SESSION['captcha']) || $fm->input['captcha'] !== $_SESSION['captcha']) {
$fm->_Message('Защита от спама', 'Неверный код.');
}
}
не совсем корректно, лучше составить его таким образом:
CODE:if (!$fm->user['id'] && (!isset($_SESSEION['captcha']) || $fm->_Intval('captcha') != $_SESSION['captcha']))
$fm->_Message('Защита от спама', 'Неверный код');
Строки Защита от спама и Неверный код неплохо бы вынести в языковой файл lang_front_forums.php, чтобы можно было выводить сообщения на любом языке
Аналогично:
CODE:if (!defined('IS_ADMIN')) {
echo <<<DATA
<tr>
<td class="row4"><img src="regimage.php" border="0" alt="captcha"></td>
<td class="row4"><input type="text" style="width: 130px" name="captcha" size="13" maxlength="10"></td>
</tr>
DATA;
}
Заменяем на:
CODE:if (!$fm->user['id']) {
echo <<<DATA
<tr>
<td class="row4"><img src="regimage.php" border="0" alt="captcha"></td>
<td class="row4"><input type="text" style="width: 130px" name="captcha" size="13" maxlength="10"></td>
</tr>
DATA;
} |
|
|
altjo |
Отправлено: 30 июля 2009 — 12:31
|
ExBB Skins Creator
Покинул форум
Сообщений всего: 277
Дата рег-ции: Февр. 2009
Репутация: 86
|
в плане отображения капчи все норм,
но, есть одна странность...
$_SESSEION['captcha'] => лишняя "E"
если её убрать, то гости тоже могут создавать новые темы не вводя капчу,
если оставить $_SESSEION['captcha'],
то гости, даже при правильно введенной капче, все-равно не смогут создать новой темы...
работает так
CODE:if (!$fm->user['id'] && ($fm->input['captcha'] == '' || !isset($_SESSION['captcha']) || $fm->input['captcha'] !== $_SESSION['captcha'])) {
$fm->_Message('Защита от спама', 'Неверный код');
}
(условие проверки капчи бралось не с потолка, такой код используется в register.php)
Спасибо, все работает,
теперь и при создании сообщений тоже вышло... |
|
|
yura3d |
Отправлено: 30 июля 2009 — 15:56
|
ExBB Team ExBB Developer ExBB Mods Author
Покинул форум
Сообщений всего: 3394
Дата рег-ции: Февр. 2009
Откуда: Минск, Беларусь
Репутация: 353
|
altjo пишет:если её убрать, то гости тоже могут создавать новые темы не вводя капчу
Во всём виновата небольшая ошибка в условии, вместо инициализации входящей переменной с кодом каптчи как целочисленной, нужно инициализировать её как строку, т.е. вызов функции $fm->_Intval() заменить вызовом функции $fm->_String():
CODE:if (!$fm->user['id'] && (!isset($_SESSION['captcha']) || $fm->_String('captcha') !== $_SESSION['captcha']))
$fm->_Message('Защита от спама', 'Неверный код');
Как всегда мои опечатки
altjo пишет:(условие проверки капчи бралось не с потолка, такой код используется в register.php)
Всё дело в том, что использованию переменных входящих данных (в контексте $fm->input) обязательно должна предшествовать инициализация этих переменных. В Вашем случае $fm->input['captcha'] вызывается без инициализации (хотя в register.php эта инициализация есть, просто она записана выше условия), и это в некоторых случаях может приводить к выводу сообщений об ошибках (пресловутых notice'ов, которые не так давно обсуждались) |
|
|
|