Скрипт регистрации в таблицу Phpbb 3.0.9

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Llfe
phpBB 1.0.0
Сообщения: 1
Стаж: 14 лет 9 месяцев

Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение Llfe »

Итак, я написал скрипт регистрации, данные которого отправляются в таблицу допустим "users". Но мне нужно чтобы эти данные (логин, пароль, имейл) отправлялись в таблицу "forum_users", установленного мною форума (phpbb 3.0.9). Но выбивает ошибку, в любую другую таблицу нормально проходит, а именно в таблицу аккаунтов этого форума эррорка! Подскажите, будьте добры! Вот собственно мой скрипт:

Код: Выделить всё

<?php 
if(isset($_POST['submit'])){ //выполняем нижеследующий код, только если нажата кнопка 
$query = mysql_query("SELECT * FROM `forum_users` WHERE `username`='".$_POST['login']."'"); //отправляем запрос на выборку всего содержимого , где поле логин равно переменной $login 
$row = mysql_num_rows($query); // считаем количество рядов результата запроса 
if(empty($_POST['login'])){ //если переменная логина пуста или не существует 
echo"Вы не ввели логин"; // выводим сообщение об ошибке 
}elseif(!preg_match("/[-a-zA-Z0-9]{3,15}/", $_POST['login'])){ //если переменная не соответствует шаблону -a-zA-Z0-9 
echo"Вы неправильно ввели логин"; // выводим сообщение об ошибке 
}elseif(empty($_POST['password'])){ //если переменная логина пуста или не существует 
echo"Вы не ввели пароль"; // выводим сообщение об ошибке 
}elseif($row > 0){ //если переменная больше 0 
echo"Такой пользователь уже существует!"; // выводим сообщение об ошибке 
}elseif(!preg_match("/[-a-zA-Z0-9]{3,30}/", $_POST['password'])){ //если переменная не соответствует шаблону -a-zA-Z0-9 
echo"Вы неправильно ввели пароль"; // выводим сообщение об ошибке 
}elseif(empty($_POST['password2'])){ //если переменная логина пуста или не существует 
echo"Вы не ввели подтверждение пароля"; // выводим сообщение об ошибке 
}elseif(!preg_match("/[-a-zA-Z0-9]{3,30}/", $_POST['password2'])){ //если переменная не соответствует шаблону -a-zA-Z0-9 
echo"Вы неправильно ввели подтверждение пароля"; // выводим сообщение об ошибке 
}elseif($_POST['password'] != $_POST['password2']){ //если переменная пароля и переенная повтора пароля не одинаковы 
echo"Вы неправильно ввели подтверждение пароля"; // выводим сообщение об ошибке 
}elseif(empty($_POST['email'])){ //если переменная E-mail'a пуста 
echo"Вы не ввели E-mail"; // выводим сообщение об ошибке 
}elseif(!preg_match("/[-a-zA-Z0-9_]{3,20}@[-a-zA-Z0-9]{2,64}\.[a-zA-Z\.]{2,9}/", $_POST['email'])){ //регулярка на проверку правильности email 
echo"Вы неправильно ввели E-mail"; // выводим сообщение об ошибке 
}else{ //если же ошибок нет 
$login = $_POST['login']; //присваеваем переменную 
$password = md5($_POST['password']);//присваеваем переменную и кодируем её в md5 для безопасности 
$email = $_POST['email'];//присваеваем переменную 

$insert = mysql_query("INSERT INTO `forum_users` (`username` ,`user_password` ,`user_email` ) VALUES ('$login', '$password', '$email')"); //выполняем запрос на добавление нового пользователя 
if($insert == true){ 
echo "Вы успешно зарегистрированы!"; 
}else{ 
echo "Непредвиденная ошибка!"; 
} 

} 

} 
?>
Последний раз редактировалось FEAR93 22.12.2011 20:52, всего редактировалось 2 раза.
Причина: Добавил BBCode. Переехали.
Аватара пользователя
FEAR93
Former team member
Сообщения: 666
Стаж: 17 лет 11 месяцев
Откуда: Кривой Рог, Украина
Благодарил (а): 22 раза
Поблагодарили: 76 раз

Re: Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение FEAR93 »

1. Исправьте сообщение в соответствии с правилами, касается кода.
2. Про использования tab в коде слышали? Сейчас код очень трудно читаем.
3. Что за ошибку выдаёт скрипт, нам угадать?
А где твоя Родина, сынок?! Сдал Горбачёв твою Родину американцам, чтобы тусоваться красиво.

Шаблон запроса.
Правила.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение Sheer »

Код: Выделить всё

$insert = mysql_query("INSERT INTO `forum_users` (`username` ,`user_password` ,`user_email` ) VALUES ('$login', '$password', '$email')"); 
Неправильно оформлен SQL-запрос.
Раскурите функциюuser_add() из файла functions_user.php
Найти

Код: Выделить всё

$sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 
После вставить

Код: Выделить всё

print ("$sql<br />"); 
Увидите правильный SQL-запрос.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение MIT »

Llfe

1. Твой код не безопасен, его нельзя использовать.

2. В контексте phpBB необходимо пользоваться свойствами объекта $db, использование стандартных функций типа mysql_* запрещено (ну, тебя никто не побъёт за это, но смысл использовать функционал форума действительно есть).

3. Нет никакой необходимости пихать данные в таблицу _users. Тем более, что ручное запихивание туда данных не эквивалентно регистрации пользователя. Функцию user_add() надо не курить, а, в данном случае, использовать вместо своего варианта, отправляя в неё свои данные. В том же файле лежат функции валидации почтового адреса, пароля, логина. Можно использовать и их.
Аватара пользователя
FEAR93
Former team member
Сообщения: 666
Стаж: 17 лет 11 месяцев
Откуда: Кривой Рог, Украина
Благодарил (а): 22 раза
Поблагодарили: 76 раз

Re: Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение FEAR93 »

MIT писал(а):1. Твой код не безопасен, его нельзя использовать.
А можно тут подробней? Есть самописный скрипт, только с $_GET запросами, очень волнует безопасность.
А где твоя Родина, сынок?! Сдал Горбачёв твою Родину американцам, чтобы тусоваться красиво.

Шаблон запроса.
Правила.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Скрипт регистрации в таблицу Phpbb 3.0.9

Сообщение MIT »

Да, если коротко:
1.

Код: Выделить всё

mysql_query("SELECT * FROM `forum_users` WHERE `username`='".$_POST['login']."'");
Если я отправлю в поле логина ' (одинарную кавычку), то будет ошибка синтаксиса запроса. А если я засуну вместо логина что-нибудь в духе ' or 1=1 --, то запрос примет совершенно другой смысл...
Все проверки надо проводить ДО реального использования данных. Все данные экранировать и проверять их тип.

2.

Код: Выделить всё

preg_match("/[-a-zA-Z0-9]{3,15}/", $_POST['login'])
Проверка — это хорошо. Но мы уже поняли что поздно проверять данные, хотя ошибка есть и в этой строке: функция preg_match может принимать вторым параметром только строковое значение, в то время, как протокол HTTP позволяет передавать массивы. Если я передам в качестве логина массив, появится предупреждение с кучей информации (если, конечно, вывод подобных уведомлений не отключён).
Надо проверять (или насильно устанавливать через приведение ($_POST['login'] = (string)$_POST['login'];)) типы данных.

3.

Код: Выделить всё

preg_match("/[-a-zA-Z0-9]{3,15}/", $_POST['login'])
Регулярные выражения — штука потрясающая. Но ими надо уметь пользоваться. В этой строке подразумевается, что переданная строка должна быть от 3 до 15 символов и содержать определённые символы, но вот проблема: мы не указали, что строка должно ЦЕЛИКОМ (от начала и до конца) соответствовать данному выражению. А PCRE (движок регулярок в PHP, как и любой другой) ищет, по-умолчанию, вхождения шаблона в строку. Т.е. под такой шаблон попадает совершенно спокйоно и строка [color=#FF0000]{!!!}[/color][color=#008000]mylogin[/color][color=#FF0000][)(*&^%$#@!@!)[/color], потому что строка считается валидной, раз в ней найдена последовательность символов ([color=#008000]mylogin[/color]), соответствующая выражению.

Эти три ошибки повторяются здесь несколько раз.

Ну и между делом: проверка на E-Mail некорректна, как минимум не хватает поддержки . (точки) в логине почты, ограничение длины лишнее (спокойно может быть адрес a@mydomain.cn), нет поддержки высокой степени вложенности (a@my.do.main.cn)

Вернуться в «Для авторов (phpBB 3.0.x)»