X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Емейл не записывается в базу данных при регистрации
trisgot
trisgot
Topic Starter сообщение 5.3.2016, 23:29; Ответить: trisgot
Сообщение #1


файл с регистрацией

<?php
require_once "lib/functions.php";
session_start();
if (isset ($_POST['reg'])) {
$login = htmlspecialchars($_POST['login']);
$password = htmlspecialchars($_POST['password']);
$email = htmlspecialchars($_POST['email']);
$captcha = htmlspecialchars($_POST['captcha']);
$bad=false;
unset($_SESSION['error_captcha']);
unset($_SESSION['error_login']);
unset($_SESSION['error_password']);
unset($_SESSION['error_email']);
unset($_SESSION['success_reg']);
if (($captcha != $_SESSION["rand_code"]) || ($captcha =="")) {
$_SESSION['error_captcha']=1;
$bad = true;
}
if ((strlen($login)<3) || (strlen($login) > 32)) {
$_SESSION['error_login']=1;
$bad=true;
}
if ((strlen($password)<6) || (strlen($password)>32)) {
$_SESSION['error_password']=1;
$bad = true;
}
if (!$bad){
regUser($login, md5($password), $email);
$_SESSION['reg_success']=1;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" href="style.css" type="text/css"/>
<link href="/jq/jquery.bxslider.js" rel="stylesheet" />
<link href="/jq/jquery.bxslider.css" rel="stylesheet" />
<title> Dream-mam - Беременность, Роды, Ребенок, Дети, Семья</title>
<link rel="stylesheet" type="text/css" href="style.css" media="all" />
<link rel="stylesheet" media="all" href="style/type/puritan.css" />
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="style/css/ie7.css" media="all" />
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Информация о воспитании детей, интересные статьи для будущих мам, детское меню и первый прикорм ">
</head>
<body>
<?php
include "blocks/menu.php";
?>
<div class="osnova">
<h1 >Регистрация на сайте</h1>
<form id="form1" action="" method="post">
<?php
if ($_SESSION['error_captcha'] == 1) echo "<p><span style = 'color: red;'> Неверный проверочный код</span></p>";
if ($_SESSION['error_email'] == 1) echo "<p><span style = 'color: red;'> Неккоректный емейл </span></p>";
if ($_SESSION['error_login'] == 1) echo "<p><span style = 'color: red;'> Неккоректный логин</span></p>";
if ($_SESSION['error_password'] == 1) echo "<p><span style = 'color: red;'> Неккоректный пароль</span></p>";
?>
<div class="blok4">
<table class="reg">
<tr>
<td>
<label>Ваш логин: </label>
</td>
<td>
<input type='text' name='login'/>
</td>
</tr>
<tr>
<td>
<label>Ваш пароль: </label>
</td>
<td>
<input type='password' name='password'/>
</td>
</tr>
<tr>
<td>
<label>Ваша электронная почта: </label>
</td>
<td>
<input type='email' name='email'/>
</td>
</tr>
<tr>
<td>

</td>
<td>
<img src="captcha/captcha.php" alt="Капча"/>
</td>
</tr>
<tr>
<td>
<label>Введите проверочный код: </label>
</td>
<td>
<input type='text' name='captcha'/>
</td>
</tr>
<tr>
<td cosplan="2">
<input type='submit' name='reg' value='Зарегистрироваться'/>
</td>
</tr>
</table>
</div>
</form>
</div>


часть файла function 

function regUser($login, $password, $email) {
$mysqli = connectDB();
$activation = getActivateLink($email);
$mysqli->query("INSERT INTO users (`login`, `password`, `email`, `activation`, ) VALUES('$login', '$password','$email', '$activation', )");
mail("$email", "Для регистрации на сайте, перейдите по ссылке", "http://localhost/deti/act.php?email=$email&key=$activation");
closeDB($mysqli);
}

function getActivateLinkFromTable ($email) {
$mysqli = connectDB();
$result_set = $mysqli->query("SELECT `activation` FROM `users` WHERE `email` = '$email'");
$row = $result_set->fetch_assoc();
$result_set->close();
closeDB($mysqli);
return $row['activation'];
}
// очищение ссылки активации
function activateUser($login) {
$mysqli = connectDB();
$mysqli->query("UPDATE `users` SET `activation` = '' WHERE `email` = '$email'");
closeDB($mysqli);
//
}
function checkActivateLink ($login, $key) {
$real_key = getActivateLinkFromTable ($login);
return $real_key === $key;
}
function getActivateLink ($login) {
$secret = "Qdbntre";
return md5($secret.$login);
}

function checkUser ($login, $password) {
if (($login == "") || ($password == "")) return false;
$mysqli = connectDB();
$result_set = $mysqli->query("SELECT password, activation FROM users WHERE login = '$login'");
$user = $result_set->fetch_assoc();
$real_password = $user['password'];
$act = $user['activation'];
if ($act !="") return false;
closeDB($mysqli);
return $real_password == $password;

регистрация вроде проходит, в базе данных записывается только логин и пароль, а электронного адреса нет.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gifas
gifas
сообщение 5.3.2016, 23:42; Ответить: gifas
Сообщение #2


Этот код полон ошибок, начиная от изменения (ибо это не защита базы, а защита вывода) пароля при вводе в базу (очистка того, что никогда не выводится), будет сюрприз. Заканчивая md5, которая вообще никакая  и дефакто запрещена к применению повсеместно, кроме кешей и прочих доп. вещей.
Если емаил не заносится, то проверяете что там при вводе в базу.
  •     function activateUser($login) {

  •         $mysqli = connectDB();

  • //здесь проверить, что идет в запрос var_dump($email), конечно, на локалхосте. иначе фильтр по ip

  •         $mysqli->query("UPDATE `users` SET `activation` = '' WHERE `email` = '$email'");

  •         closeDB($mysqli);

  • //

  •     }


Функция имеет локальную область видимости и вы получите notice, ибо в функцию приходит $login, а обновляется $email. Раз об этом не сказали, то ошибки выключены. Так не делается.

UPD. Неправильно прочитал тему. Но тоже таким макаром - через проверку что на входе SQL выражения


Сообщение отредактировал jytyx - 5.3.2016, 23:57
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
trisgot
trisgot
Topic Starter сообщение 6.3.2016, 0:52; Ответить: trisgot
Сообщение #3


jytyx, я только еще разбираюсь в php, и в основном по видео урокам делала, а про md5 так было предложено в уроках. Вообщем мне легче пока убрать активацию через емейл)) я мало что поняла, что вы мне ответили, мне пока сложно)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gifas
gifas
сообщение 6.3.2016, 1:15; Ответить: gifas
Сообщение #4


(trisgot @ 6.3.2016, 02:52) *
я только еще разбираюсь в php,

по каким урокам вы занимаетесь, если не секрет, чтобы не дискредитировать автора, не нужно имени и не надо ссылок, хотя бы где вы их нашли и кто посоветовал? Честно, в Вашем коде просто лень разбираться и смотреть. нет никакого контроля кода. У меня квалификация не настолько высока, чтобы такой код разбирать)

 

 

 



Сообщение отредактировал jytyx - 6.3.2016, 1:16
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
trisgot
trisgot
Topic Starter сообщение 6.3.2016, 20:44; Ответить: trisgot
Сообщение #5


jytyx, нашла на ютубе уроки Михаила Русакова, никто не советовал, просто он простым языком объясняет, поэтому и делала по его видео урокам. Про активацию по емейл там нужно было самой добавить)) 
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gifas
gifas
сообщение 6.3.2016, 23:09; Ответить: gifas
Сообщение #6


trisgot, Ясно. Тогда просто добавлю некоторые замечания.
Вкратце.
Настройте редактор, первое мое сообщение об использовании $email и $login в нормальной ide выдало бы вам две ошибки - об отсутствии инициализации $email и о неиспользовании $login.
Вы обращаетесь к массиву if ($_SESSION['error_captcha'] Допустим, на этот момент ключа такого вообще нет, то вы получите уведомление.
Настройте показ ошибок Если распечатки их на рабочем сайте, то они  могут вывести инфу любому, поэтому нужно позаботиться - проверка по вашему ip или передача чего в адрес, чтобы только вы видел. Да и работаете же вы на локалхосте.
Вы дублируете код. Что, например, если я скажу, что в htmlspecialchars нужно выставить кодировку и вид кавычек? А в таком виде её применять небезопасно (был баг не помню в какой версии, IE страдал). Вам придется исправлять во многих местах. Должно быть одно место. Вообще, это защита вывода (гуглите о XSS). Пароль не выводится нигде, изменять его не очень хорошая затея. Обычно защищают от xss на выходе, ибо в базе все равно что-там (но от sql-иньекций на входе)
Вы не защищаете базу от SQL-иньекций. Для этого в php есть спецфункция.
для хеша пароля юзайте password_hash (но с ней не стоит умничать и добавлять свою соль, может наоборот получиться) или спец библиотеки
Во втором случае - насчет ссылки активации по md5 можно легко узнать пароль, а это потеря смысла его строгого хеширования. Если эта ссылка попадет куда не туда или останется в базе, то шифрования нет. Юзер может оставить письмо у себя в клиенте, хакер вытянуть оттуда этот хеш и либо так поломать (md5 же) либо из кода выдрать, как-то так. Возможно, использовать что-то другое и md5, по хеш которой не даст ничего полезного. Тогда да - md5 быстрая. это её преимущество.
Функция mail одиноко брошена в коде. Что будет, если она не сработает или сработает с ошибкой?
strlen возвращает количество байт. Учитывайте, когда будете писать в разметке какова длина пароля! Для юникода это не количество символов в строке.
return $real_password == $password; - вы попались на классическую уязвимость в php, при определенных обстоятельствах в каких-то там версиях последствия очень неприятны. Даже при использовании === (вообще == это зло, оно непредсказуемо и должно использоваться лишь в исключительных случаях, много раз подумать зачем и когда, ибо сравнивает с приведением типа) есть атака по времени, поэтому для секьюрного сравнения строк есть разные функции, в свежих версиях php есть hash_equals
Не проверяете, что поступает в функцию на допустимые значения или пустоту, функции берут на себя слишком много, жестко записываете значения и смешиваете верстку и код, не проверяете что пришло из базы, содержит ли массив ключ. Не проверяете, что в $mysqli после открытия соединения.
php это не html и css. отличие - это каскадный отказ или просто отказ сайта. Косяк в верстке может сделать сайт нерабочим, но чаще - ограниченно рабочим. Косяк в php (да и js) может его вообще положить или дать доступ хакеру. Ошибки в вашем коде не должны ложить сайт, они должны отключать регистрацию и уведомлять. Для более тонкого контроля и созданы исключения.
 с чистым SQL мало кто работает (исключение - высокопроизводительные, специфические запросы), процедурное программирование вымирает (хотя некоторые cms, даже crm - suite, vtiger, еще и написаны так, но уже в современных фреймворках вы его не найдете.) Вас проклянут за длинную ленту функций
юзайте точку останова в редакторе или вардамп. Точка\распечатка перед regUser - посмотрели что в емаил. Вошли в функкцию - посмотрели, что в $mysqli и далее как там у вас инсерт работает. Дописали проверку на ошибку от базы, закрыли соединение (при закрытии тоже может быть ошибка, учитывайте), проверили в редакторе,  или через консоль, или через mysqlworkbench, что соединение действительно закрыто. Проверили базу. Если опять не пишется, посмотрели лог своей mysql (включить в конфиге на все запросы) как заходит запрос в базу. проверка на логин и пароль есть, на мыло нет.
'$activation', )"); - запятая в запросе после $activation должна дать ошибку синтаксиса.
Может я в упор не вижу  еще чего, но к вечеру я туплю.


Сообщение отредактировал jytyx - 6.3.2016, 23:46
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
trisgot
trisgot
Topic Starter сообщение 6.3.2016, 23:56; Ответить: trisgot
Сообщение #7


jytyx,спасибо большое! Буду разбираться! 
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gifas
gifas
сообщение 7.3.2016, 0:34; Ответить: gifas
Сообщение #8


trisgot, а да туплю, сразу не написал, еще нюанс. в отправке писем. В адрес ($email) можно подставить список из большого количества левых людей, разделенного запятыми  (в доках запятые, но хз насчет перевода строки, лень читать rfc) и письмо отправится им всем). Вроде htmlspecialchars ничего с переводами строк не делает. просто учитывайте, что это может быть и никогда не доверяйте пользовательским данным в отправках писем.. Например, можно спамнуть с вашего сервера и отправить его в спам листы почтовиков и т.п. Или просто нагрузить его. Поэтому есть смысл подумать еще и  о лимитах. Если капчу ломанут, то заспамят базу. а вот почтовый спам и попадание в спам-листы это проблема.


Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


Сообщение отредактировал jytyx - 7.3.2016, 1:00
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыПродам базу сайтов Wordpress в 16 миллионов доменов! Свежая сборка.
19 Boymaster 11150 Сегодня, 0:01
автор: Boymaster
Открытая тема (нет новых ответов) Интеграция спортивных данных API. Коэффициенты БК, Live результаты
15 yaroslav89 6845 8.4.2024, 17:17
автор: spoyer_ru
Открытая тема (нет новых ответов) Мегамаркет. Скидка 1000 рублей при покупке от 5000 рублей на все, на первый заказ.
Мегамаркет. Скидка 1000 рублей при покупке от 5000 рублей на все, на п
7 stu999 1753 31.3.2024, 11:19
автор: stu999
Открытая тема (нет новых ответов) Подкиньте базу ключей тематики wallpaper - Обои для рабочего стола
0 uahomka 865 27.2.2024, 0:38
автор: uahomka
Открытая тема (нет новых ответов) ГОРЯЧИЕ FOREX|CRYPTO ЛИДЫ. БАЗЫ ДАННЫХ
[Чарджбек|Рекавери|Возврат]
9 Leado 3893 9.2.2024, 16:04
автор: baza0013


 



RSS Текстовая версия Сейчас: 20.4.2024, 8:24
Дизайн