Перейти к контенту

Проверка Login, Password, Email как в 2.1.х


Рекомендуемые сообщения

Так, Dekker с НГ тебя, держи модификацию.

 

Запихивать в архив не намерен (не пользую и не собираюсь и ваще еще проверить надо), но не против.

 

Некоторое время будет демо-версия, демоверсия больше недоступна.

 

Можете посмотреть аналоговый вариант для 2.0.x тут.

 

Позволю себе заметить, что проверка логина проходит куда более просто относительно клиентской стороны, если сравнивать с 2.1х.

Проверки взял те, что беруться при регистрации.

 

Открыть файл sources/Register.php

Найти:

		switch($ibforums->input['CODE'])
	{

Добавить ниже:

			case 'tname':
			$this->test_name();
			break;

		case 'tmail':
			$this->test_mail();
			break;

Найти:

}

?>

Добавить выше:

	function test_name($err=""){
	global $ibforums,$DB;
	$name = $_GET['name'];
	$name = trim( str_replace( '|', '|' , $name ) );
	$name = preg_replace( "/\s{2,}/", " ", $name );
	if ($ibforums->vars['ban_names'])
	{
		$names = explode( "|" , $ibforums->vars['ban_names'] );
		foreach ($names as $n)
		{
			if ( $n == "" )
				continue;
			if (preg_match( "/".preg_quote($n, '/' )."/i", $name ))
				$err .= "Имя в блеклисте.<br>";
		}
	}
	$DB->query("SELECT id FROM ibf_members WHERE name='".addslashes($name)."' LIMIT 1;");
	if($DB->fetch_row())
		$err .= "Имя уже зарегистрировано<br>";
	die("<html>\n<head>\n<meta http-equiv=\"Content-Type\" CONTENT=\"text/html; CHARSET=Windows-1251\">\n<script type='text/javascript'>\n<!-- //\ntop.TestNameRes('$err');\n// -->\n</script>\n</head></html>");
}

function test_mail($err=""){
	global $INFO;
	$email_list = explode("|",$INFO['ban_email']);
	if(get_magic_quotes_gpc())
		$_GET['mail'] = stripslashes($_GET['mail']);
	for($i=0;$i<count($email_list);$i++){
		$black = str_replace("\\*",".+",preg_quote($email_list[$i],"/"));
		if(preg_match("/^$black$/",$_GET['mail'])){
			$err = "Ваш E-Mail или сервис E-Mail'ов в чёрном списке.";
			break;
		}
	}
	die("<html>\n<head>\n<meta http-equiv=\"Content-Type\" CONTENT=\"text/html; CHARSET=Windows-1251\">\n<script type='text/javascript'>\n<!-- //\ntop.TestMailRes(\"$err\");\n// -->\n</script>\n</head></html>");
}

Сохранить и загрузить на сервер.

 

ACP -> Стили -> (нужный стиль) -> Дописать вниз:

.reg_green{border:1px solid green}
.reg_red{border:1px solid red}
.reg_black{border:1px solid black}

 

Главная страница AЦ -> Главная страница настройки шаблонов -> (нужный скин) -> skin_register -> Main Registration Form

Стереть всё и написать:

<form action="{ibf.vars.board_url}/index.{ibf.vars.php_ext}" method="post" name='REG' onsubmit='return Validate()'>
<input type='hidden' name='act' value='Reg' />
<input type='hidden' name='CODE' value='02' />
<input type='hidden' name='coppa_user' value='{$data['coppa_user']}' />
<b>{ibf.lang.reg_header}</b><br /><br />{$data['TEXT']}
<br />
<br />
<div class="tableborder">
 <div class="maintitle"><{CAT_IMG}> {ibf.lang.registration_form}</div>
 <div class="pformstrip">{ibf.lang.complete_form}</div>
 <table class="tablebasic">
 <tr>
  <td colspan=2 id="err_name" style="display:none;"></td>
 </tr>
 <tr>
<td class="pformleft">{ibf.lang.user_name}</td>
<td class="pformright"><input type='text' size='32' maxlength='64' value='{$ibforums->input['UserName']}' name='UserName' onblur="TestName();" class="reg_black" disabled /></td>
 </tr>
 <tr>
  <td colspan=2 id="err_pass" style="display:none;"></td>
 </tr>
 <tr>
<td class="pformleft">{ibf.lang.pass_word}</td>
<td class="pformright"><input type='password' size='32' maxlength='32' value='{$ibforums->input['PassWord']}' name="PassWord" class="reg_black" onblur="if(p3.value.length)TestPass();" disabled /></td>
 </tr>
 <tr>
<td class="pformleft">{ibf.lang.re_enter_pass}</td>
<td class="pformright"><input type='password' size='32' maxlength='32' value='{$ibforums->input['PassWord_Check']}' name='PassWord_Check' class="reg_black" onblur="if(p2.value.length)TestPass();" disabled /></td>
 </tr>
 <tr>
  <td colspan=2 id="err_mail" style="display:none;"></td>
 </tr>
 <tr>
<td class="pformleft">{ibf.lang.email_address}</td>
<td class="pformright"><input type='text' size='32' maxlength='50' value='{$ibforums->input['EmailAddress']}' name='EmailAddress' class="reg_black" onblur="if(p5.value.length)TestMail();" disabled /></td>
 </tr>
 <tr>
<td class="pformleft">{ibf.lang.email_address_two}</td>
<td class="pformright"><input type='text' size='32' maxlength='50'  value='{$ibforums->input['EmailAddress_two']}' name='EmailAddress_two' class="reg_black" onblur="if(p4.value.length)TestMail();" disabled /></td>
 </tr>
 <!--{REQUIRED.FIELDS}-->
 <!--{OPTIONAL.FIELDS}-->
 <!--IBF.MODULES.EXTRA-->
 </table>
</div>
<br />
<!--{REG.ANTISPAM}-->
<br />
<div class="tableborder">
 <div class="pformstrip">{ibf.lang.terms_service}</div>
 <div class="tablepad" align="center">
  <strong>{ibf.lang.terms_service_text}</strong>
  <br />
  <br />
  <textarea cols='75' rows='9' readonly="readonly" name='Post' class='textinput'>{$data[RULES]}</textarea>
  <br /><br /><div id="err_aggr" style="display:none;"></div><b>{ibf.lang.agree_submit}</b> <input type='checkbox' name='agree' value='1' onclick="TestAgree();" disabled class="reg_black" />
 </div>
 <div id="err_sbmt" style="display:none;"></div>
 <div class="pformstrip" align="center"><input type="submit" value="{ibf.lang.submit_form}" class='forminput' name="submit" disabled /></div>
</div>
</form>
<script type="text/javascript">
<!-- //
var p1 = document.REG.UserName;
var p2 = document.REG.PassWord;
var p3 = document.REG.PassWord_Check;
var p4 = document.REG.EmailAddress;
var p5 = document.REG.EmailAddress_two;
var p6 = document.REG.agree;
var e1 = document.getElementById("err_name");
var e2 = document.getElementById("err_pass");
var e3 = document.getElementById("err_mail");
var e4 = document.getElementById("err_aggr");
var e5 = document.getElementById("err_sbmt");
function Validate() {
// Check for errors
if(p1.className!="reg_green" || p2.className!="reg_green" || p4.className!="reg_green" || p6.className!="reg_green"){
	e5.innerHTML = "Вы не можете отправить данные, пока они не будут введены верно.<br>\nВерные данные отмечены зелёным, неверные - красным, не проверенные - чёрным.";
	e5.style.display="";
	return false;
}
return true;
}

function TestAgree(){
if(p6.checked)
	p6.className="reg_green";
else
	p6.className="reg_red";
}

function TestMail(){
if(p4.value.toLowerCase() != p5.value.toLowerCase()){
e3.innerHTML = "Введённые E-Mail адреса не совпадают!";
e3.style.display="";
p4.className="reg_red";
p5.className="reg_red";
}
else if(!p4.value.match(/^[a-z_0-9-]{2,32}@([a-z_0-9-]{2,32}\.){1,8}[a-z]{1,5}$/i)){
e3.innerHTML = "Таких E-Mail адресов не существует.";
e3.style.display = "";
p4.className="reg_red";
p4.className="reg_red";
}
else{
e3.innerHTML = "<iframe src='index.php?act=Reg&CODE=tmail&mail="+p4.value+"'></iframe>";
e3.style.display = "none";
p4.className = "reg_black";
p5.className = "reg_black";
}
}

function TestMailRes(r){
if(r==""){
p4.className="reg_green";
p5.className="reg_green";
}
else{
p4.className="reg_red";
p5.className="reg_red";
e3.style.display = "";
e3.innerHTML = r;
}
}

function TestName(){
if(p1.value.match(/[^1-9a-zа-я_-]/i)){
e1.style.display = "";
e1.innerHTML = "Имя содержит запрещённые символы.";
p1.className = "reg_red";
}
else if(!p1.value.length){
e1.style.display = "";
e1.innerHTML = "Не введено имя.";
p1.className = "reg_red";
}
else if(p1.value.length < 3){
e1.style.display = "";
e1.innerHTML = "Введено слишком короткое имя.";
p1.className = "reg_red";
}
else if(p1.value.length > 32){
e1.style.display = "";
e1.innerHTML = "Введено сликшом длинное имя.";
p1.className = "reg_red";
}
else{
e1.innerHTML="<iframe src='index.php?act=Reg&CODE=tname&name="+p1.value+"'></iframe>";
e1.style.display = "none";
p1.className = "reg_black";
}
}

function TestNameRes(r){
if(r==""){
p1.className = "reg_green";
}
else{
e1.style.display = "";
e1.innerHTML = r;
p1.className = "reg_red";
}
}

function TestPass(){
if(p2.value != p3.value){
e2.style.display = "";
e2.innerHTML = "Введённые пароли не совпадают.";
p2.className = "reg_red";
p3.className = "reg_red";
}
else if(p2.value.length < 3){
e2.style.display = "";
e2.innerHTML = "Введён слишком короткий пароль.";
p2.className = "reg_red";
p3.className = "reg_red";
}
else{
e2.style.display = "none";
p2.className = "reg_green";
p3.className = "reg_green";
}
}
p1.disabled = false;
p2.disabled = false;
p3.disabled = false;
p4.disabled = false;
p5.disabled = false;
p6.disabled = false;
document.REG.submit.disabled = false;
// -->
</script>

 

Всё готово, можно тестить.

 

Вернее, почти всё, для тех кто хочет видеть в имени пользователя только кирилицу или только латиницу:

Главная страница AЦ -> Главная страница настройки шаблонов -> (нужный скин) -> skin_register -> Main Registration Form, ищем:

function TestName(){

Добавить ниже:

if(p1.value.match(/[a-z]/i) && p1.value.match(/[а-я]/i)){
e1.style.display = "";
e1.innerHTML = "Нельзя использовать и кириллицу и латиницу в имени.";
p1.className="reg_red";
return;
}

 

Разрабатывалсь и тестировалось на

Русский Модифицированный IPB v1.3 Final © 2003 BesTFileZ.Net & IBR Team
Ссылка на комментарий
Поделиться на других сайтах

Отличная модификация! Тебе большой респект!

Но есть пара замечаний:

1) В Опере "Имя уже зарегестрировано" и т.д. отображается аброй-кодаброй - как пофиксить?

2) А можно ли еще на мыло ограничение поставить, например, что форум регистрирует пользователей только с мылом на @mail.ru???

Ссылка на комментарий
Поделиться на других сайтах

Firefox не нравяться классы reg_red и reg_black он их просто не выводит зато нормально общаеться с reg_green

 

под тем же Firefox (1.0.7 может старый ? под 1.5 не тестировал он у меня на работе) ERR сообщения могут появиться и справа в таблице и слева и непосредственно над полем ввода

 

на скринах заметно смещение сообщения об ошибке и то что red_reg не выводиться

 

под IE все абсолютно нормально :D а вообще главное сделано - начало, а дальше отшлифуем.

 

СПАСИБО ;)

 

Smake

у меня это мод стоит в качестве блокировки того же маил.ру, не думаю что автор зайдет настолько далеко :)

 

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

 

вот подобное стоит у меня, как делал уже не помню, мод брал на изе

post-926-1136642160_thumb.jpg

post-926-1136642169_thumb.jpg

post-926-1136643079_thumb.jpg

Ссылка на комментарий
Поделиться на других сайтах

модификация ругается на маилы вида test@abc.crimea.ua хотя существоание маил адресов на доменах третьего уровня вполне допустимо :D

 

не проходит проверка на смесь символов кирилицы и латиницы

Ссылка на комментарий
Поделиться на других сайтах

Dekker

Пасяб за совет по поводу блокировок, а вот как найте это на IZE :D

Подскажи или название, или хоть по каким аргументам искать, плиз ;)

 

пасиб еще раз - уже нашел!

Ссылка на комментарий
Поделиться на других сайтах

2Smake

1. Гмм.. Понял, надо сообщить кодировку - сделаю.

2. Да, посмотрите функцию TestMail() - аналогично добавьте условия. Замечу, что клиентская проверка не гарантирует, что пользователь не отправит данные.

 

2Dr.Freddy

Идея не моя, а Dekker'а, вернее я давно подумывал об этом, но стал делать после его просьбы.

Переделывать по 2.0.х буду, но на общее обозрение только, если кому-либо в подарок или за деньги - писать инструкции очень не люблю.

 

2h8)u

Моя задача сделать программно, чтобы не было проблем, оформление можете менять сами.

 

2Dekker

Хмм, интересно, почему классы не нравятся.. Надо будет потестить.

 

А, ну всё ясно, это ошибка разработчиков, поставь новую версию :D)

Блин, незнаю, нету у меня такого старья, чтобы тестить.

 

На каких скринах? И не red_reg, а reg_red. reg_ я дописал на всякий случай, чтобы проблем не было, хотя возможно ему не нравится нижнее подчёркивание (ему - файрвоксу).

 

Ну дык разумеется, я под IE тестил ;)

 

Хмм, упустил как-то из виду, сделаем, запросто.

 

Где конкретно не проходит проверка на смесь кирилицы и латиницы?

 

___________________

Фрр, вроде всем ответил )

 

Ага, вот скрины заметил :)

 

Так, по-поводу кодировки в Opera:

Тем кто уже поставил, открывать файл sources/Register.php и найти:

die("<script type='text/javascript'>\n<!-- //\ntop.TestNameRes('$err');\n// -->\n</script>");

Заменить на:

die("<html>\n<head>\n<meta http-equiv=\"Content-Type\" CONTENT=\"text/html; CHARSET=Windows-1251\">\n<script type='text/javascript'>\n<!-- //\ntop.TestNameRes('$err');\n// -->\n</script>\n</head></html>");

 

Для остальных сейчас исправлю первый пост.

 

Что касается классов - в опере тоже не работают.. Очень странный глюк.

 

Теперь, что касается стилей - нашёл, досадная опечатка..

ACP -> Стили -> (нужный стиль) -> Найти:

input.reg_green{border:1px solid green};
input.reg_red{border:1px solid red};
input.reg_black{border:1px solid black};

Заменить на:

input.reg_green{border:1px solid green}
input.reg_red{border:1px solid red}
input.reg_black{border:1px solid black}

Верхний пост сейчас исправлю.

 

Теперь про E-Mail'ы.

Главная страница AЦ -> Главная страница настройки шаблонов -> (нужный скин) -> skin_register -> Main Registration Form

Найти:

else if(!document.REG.EmailAddress.value.match(/^[a-z_-]{2,32}@[a-z_-]{2,32}.[a-z]{1,5}$/)){

Заменить на:

else if(!document.REG.EmailAddress.value.match(/^[a-z_-]{2,32}@([a-z_-]{2,32}\.){1,8}[a-z]{1,5}$/i)){

 

Замечу, что этот фикс включает и то, что эмейлы содержащие символы верхнего регистра не принимались.

 

__________

Так..

 

Всё?

 

По-поводу блокировки, Dekker - где ты сделал третий скрин? Просто я с 1.х незнаком - незнаю, где искать.

 

Насчёт блокировки по E-Mail.

 

Пользователи -> БАН пользователей.

 

Здесь можно ввести информацию блокировки. Встаёт вопрос, может стоит перевести проверку E-Mail'а на серверную сторону, по аналогии с именем? Вероятно так и сделаю, чтобы не показывать всем и вся, какие E-Mail'ы заблокированы.

Ссылка на комментарий
Поделиться на других сайтах

Я нашел еще одну траблу!

При регистрации не воспринимаются числа в мыле!

Предлагаю решить траблу так

вот ето:

else if(!document.REG.EmailAddress.value.match(/^[a-z_-]{2,32}@[a-z_-]{2,32}.[a-z]{1,5}$/)){

заменить на ето:

else if(!document.REG.EmailAddress.value.match(/^[a-z_1-9_-]{2,32}@([a-z_-]{2,32}\.){1,8}[a-z]{1,5}$/i)){

Ссылка на комментарий
Поделиться на других сайтах

Никогда не делайте в запросах

 

WHERE LOWER(name)='".strtolower($name)."'

 

если уж на то пошлО, то надо сделать

WHERE LOWER(name)='".addslashes(strtolower($name))."'

но использование LOWER плохо тем, что эта функция.

А значит при её использовании не используется индекс по полю name таблицы ibf_members.

Это значит что MySQL перебирает всю таблицу, чтобы найти имя $name.

Если не преводить к какому-то фиксированному регистру и MySQL настроен правильно, регистр не должен иметь никакого значения и просто по

WHERE name='".addslahes($name)."'

должно всё найтись и причём найдётся очень-очень быстро.

Это очень важно при логине или авто-логине через куки.

 

К сожалению IPB просто кишит подобными багами. В частности в версии 1.х такой фигнёй полон Login.php, Register.php, Messenger.php

Ссылка на комментарий
Поделиться на других сайтах

Стопудова, только вы какой-то старый кусок взяли..

 

Найти

else if(!document.REG.EmailAddress.value.match(/^[a-z_-]{2,32}@([a-z_-]{2,32}\.){1,8}[a-z]{1,5}$/i)){

Заменить на

else if(!document.REG.EmailAddress.value.match(/^[a-z_1-9-]{2,32}@([a-z_1-9-]{2,32}\.){1,8}[a-z]{1,5}$/i)){

 

2Song.

 

При регистрации используется точно такой же запрос как и у меня -> поздравляю, мы нашли уязвимость :D))

 

Значит фикс:

sources/Register.php

Найти:

$DB->query("SELECT id FROM ibf_members WHERE LOWER(name)='".strtolower($name)."'");

Заменить на:

$DB->query("SELECT id FROM ibf_members WHERE name='".addslashes($name)."'");

Верхний пост сейчас исправлю.

Ссылка на комментарий
Поделиться на других сайтах

>> поздравляю, мы нашли уязвимость ))

 

там таких "уязвимостей" много.

Посмотреть можно Register, Login, Usercp..

Это не уязвимость, потому что одинарнные ковычки всё-таки имеются. Но лучше будет если будет стоять addslashes() на всякий случай.

Ссылка на комментарий
Поделиться на других сайтах

стили стали на место, стыдно что сам не заметил ";"

 

маил оклемался от домен третьего уровня

 

третий скрин это модификация по избавлению от надоедливых пользователей, от которых после регистрации приходиться выбирать килограммы почты о том что письма с этого адреса занесены в спам лист

не стоит обращать внимания :D мало ли у кого какие моды стоят для того что бы отвязаться от лишних ошибок

 

кому интересно сам мод с иза

blockemaildomain.txt

Ссылка на комментарий
Поделиться на других сайтах

И вообще желательно к запросу, где ищется строковая константа и заранее изветсно, что она должна быть уникальной добавлять

LIMIT 1

 

Это заставит MySQL использовать индекс даже если он его по каким-то причинам решит не использовать.

 

 

Даже кстати не знаю будет ли он использовать индекс, если поставить LIMIT 1 в запрос с LOWER()

Ссылка на комментарий
Поделиться на других сайтах

Проблемы про E-Mail временно не принимаются - перерабатываю проверку на серверную сторону с учётом банов.

 

2Dekker - может сотрёшь кучу текста и дашь ссылку? Просто она тут не совсем в тему...

 

2Song - определись уже :D

 

Ладно, sources/Register.php

Найти:

$DB->query("SELECT id FROM ibf_members WHERE name='".addslashes($name)."'");

Заменить на:

$DB->query("SELECT id FROM ibf_members WHERE name='".addslashes($name)."' LIMIT 1;");

Ссылка на комментарий
Поделиться на других сайтах

все таки страдает сверка по смеси символов кирилицы и латиницы в никах, она у меня проведена в Register.php

 

и остальным советую если еще не стоит проверка

 

находим

 

//+--------------------------------------------
	//| Check for errors in the input.
	//+--------------------------------------------

 

ниже добавляем

 

if (preg_match("#[A-Za-z]+#",$in_username) && preg_match("#[А-Ая-я]+#",$in_username))
			{
					$this->show_reg_form('err_user_mix');
					return;			
			}

 

хотя по идее конструкция

 

if((($name[$pos] <= 'ÿ') and ($name[$pos] >= 'à')) or (($name[$pos] <= 'ß') and ($name[$pos] >= 'À')) or (($name[$pos] <= 'z') and ($name[$pos] >= 'a')) or (($name[$pos] <= 'Z') and ($name[$pos] >= 'A')) or (($name[$pos] <= '9') and ($name[$pos] >= '0'))

 

должна срабатывать ...

 

Destruction

 

сорри, заменил на аттач :D

Ссылка на комментарий
Поделиться на других сайтах

Можно страдательный пример?

Вот список который я попробывал:

Dez165мавы15

абвab

сфы3т8Hnfe

AbcАбЫВ

 

Все проходят, потом, мне просто надоело.

 

2Dekker

if (preg_match("#[A-Za-z]+#",$in_username) && preg_match("#[А-Ая-я]+#",$in_username))

[А-Ая-я] - интересно... Ну вообще можно написать просто [Ая], т.к. диапазоны А-А и я-я состоят из одного элемента, разве не так?

Ссылка на комментарий
Поделиться на других сайтах

Destruction

Dekker

Ребята, не знаю как у вас, а у меня нет никаких проблем со смесью латиницы и кирилицы! А как она у вас проявляется? или проявлялась?

Ссылка на комментарий
Поделиться на других сайтах

2Smake, это ты у Dekker'а спроси - у меня всё нормально.

 

2Dekker, скорее всего, у тебя PHP суперстарый или кривой.

Ссылка на комментарий
Поделиться на других сайтах

Dekker

Так что там за проблема со смесью?

Destruction

Да скорее всего ты прав, это PHP - глюченый :D

Ссылка на комментарий
Поделиться на других сайтах

[off]

2Dekker, слушай, мне тут надо для девушки хомпагу сделать, а я в дизайнах не силён? Может ты это.. в честь НГ.. ? Ну пожалуйста :D

Ссылка на комментарий
Поделиться на других сайтах

Smake

 

я запретил на форуме при регистрации мешать кирилицу с латиницей бо

 

Dekker

 

и

 

Dеkker

 

одно и тоже ? а подстановка символа кирилицы есть - "е"

Ссылка на комментарий
Поделиться на других сайтах

Это ты имеешь в виду? Ну так вот, по дефолту это не запрещено, я делаю относительно дефолта.

 

Думаю ты сам чуть подправишь, под свою модификацию. Ок?.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.