Перейти к содержимому

Сервис обмена электронных валют


Емейл не записывается в базу данных при регистрации

#1 trisgot

trisgot
  • Пользователь
  • 12 сообщений
  • Репутация: 0
0

Отправлено 05 Март 2016 - 22:29

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

<?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

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Обработка PHP-кода - полученного из базы данных
  2. Что за ошибка в базе данных?
  3. Не могу установить движок сайта, ошибка базы данных
  4. Заклинило базу. Не удается открыть базу данных в Access 2010
  5. Одна база данных sql для нескольких сайтов.

#2 jytyx

jytyx
  • Пользователь
  • 52 сообщений
  • Репутация: 25

Отправлено 05 Март 2016 - 22:42

Этот код полон ошибок, начиная от изменения (ибо это не защита базы, а защита вывода) пароля при вводе в базу (очистка того, что никогда не выводится), будет сюрприз. Заканчивая 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: 05 Март 2016 - 22:57

  • 0

#3 trisgot

trisgot
    Topic Starter
  • Пользователь
  • 12 сообщений
  • Репутация: 0

Отправлено 05 Март 2016 - 23:52

@jytyx, я только еще разбираюсь в php, и в основном по видео урокам делала, а про md5 так было предложено в уроках. Вообщем мне легче пока убрать активацию через емейл)) я мало что поняла, что вы мне ответили, мне пока сложно)


  • 0

#4 jytyx

jytyx
  • Пользователь
  • 52 сообщений
  • Репутация: 25

Отправлено 06 Март 2016 - 00:15

я только еще разбираюсь в php,

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

 
 
 

Сообщение отредактировал jytyx: 06 Март 2016 - 00:16

  • 0

#5 trisgot

trisgot
    Topic Starter
  • Пользователь
  • 12 сообщений
  • Репутация: 0

Отправлено 06 Март 2016 - 19:44

@jytyx, нашла на ютубе уроки Михаила Русакова, никто не советовал, просто он простым языком объясняет, поэтому и делала по его видео урокам. Про активацию по емейл там нужно было самой добавить)) 


  • 0

#6 jytyx

jytyx
  • Пользователь
  • 52 сообщений
  • Репутация: 25

Отправлено 06 Март 2016 - 22:09

@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: 06 Март 2016 - 22:46

  • 1

#7 trisgot

trisgot
    Topic Starter
  • Пользователь
  • 12 сообщений
  • Репутация: 0

Отправлено 06 Март 2016 - 22:56

@jytyx,спасибо большое! Буду разбираться! 


  • 0

#8 jytyx

jytyx
  • Пользователь
  • 52 сообщений
  • Репутация: 25

Отправлено 06 Март 2016 - 23:34

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


Сообщение отредактировал jytyx: 07 Март 2016 - 00:00

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru