|
|
|
| Здравствуйте!
На одном из моих сайтах есть форма регистрации с системой подтверждения е-майл адреса. Когда пользователь переходит по ссылке для активации аккаунта то срабатывает следующий код:
$data = date('y,n,d:H,i,s');
$sql = mysql_query("SELECT id,log,pass FROM reg WHERE id = '$idlog'",$conect);
$row = mysql_fetch_array($sql);
if ($row=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
$id=$row["id"];
$log=$row["log"];
$pass=$row["pass"];
if ($id=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
if ($log=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
if ($pass=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
$sql2 = mysql_query("INSERT INTO reg2 (id,log,pass,data) Values ('$id','$log','$pass','$data')", $conect);
|
"$idlog" получаю методом GET из письма пользователя.
Итак, теперь самое интересное: когда регистрируется новый пользователь, то через определённое время в таблице "reg2" регистрируется, вернее вводит свои данные, какой-то робот, причём поле "data" имеет такой вид: 0000-00-00:00-00-00. То-есть, получается, что он вытаскивает каким-то образом новый "id" пользователя минуя этот кусок кода: "$data = date('y,n,d:H,i,s');"
Если честно, то я вообще не могу понять в чём дело...
Подскажите, кто знает, что я пропустил и как избавиться от этого робота-вредителя?
И почему, в ячейку "data" не заносится переменная "$data" если она объявлена выше? | |
|
|
|
|
|
|
|
для: sasha12342
(23.10.2013 в 19:17)
| | > И почему, в ячейку "data" не заносится переменная "$data" если она объявлена выше?
Во первых, какой тип поля data в MySQL?
Но в любом случае не такой, какой вы ему подсовываете....
Если DATE, то должно быть: Если TIMESTAMP, то:
$data = date('Y-m-d H:i:s');
|
И зачем у вас все вот это?
if ($row=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
if ($id=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
if ($log=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
if ($pass=='') {exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");}
|
Не проше?
if (!$row || !$row["id"] || !$row["log"] || !$row["pass"]) {
exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");
}
|
| |
|
|
|
|
|
|
|
для: Sfinks
(23.10.2013 в 19:27)
| | Спасибо за оперативный ответ!
Тип поля: "datetime" но ведь, когда пользователь успевает подтвердить свою регистрацию, то в это поле переменная "$data" записывается без проблем: "2013-10-16 19:10:47"
if (!$row || !$row["id"] || !$row["log"] || !$row["pass"]) {
exit ("Система не может Вас распознать. Попробуйте зарегистрироваться повторно.");
}
|
Согласен, поменяю! Но всё-же это не принципиально и не критично...
Меня больше волнует как он выслеживает свежие "id" и подставляет во вторую таблицу свои данные. Он себя чувствует как у себя дома, делает что хочет. Как от него избавиться? И как такое вообще возможно, с технической точки зрения? | |
|
|
|
|
|
|
|
для: sasha12342
(23.10.2013 в 19:17)
| | У Вас здесь не робот вредитель, у Вас здесь жесткий быдло-говно-код. Кто Вам его писал ? Если завтра обнаружите шелл на своем сайте или дефейс на всю страницу, то потом не удивляйтесь, раз так просто используете скрипты из неизвестных источников и неизвестно под чьим авторством.
SQL-Injtection в запросе, ненужные проверки почти на каждой строчке и deprecated функции для работы с БД - полный набор, в общем.
>На одном из моих сайтах есть форма регистрации с системой подтверждения е-майл адреса. Когда пользователь переходит по ссылке для активации аккаунта то срабатывает следующий код:
Зачем такая логика работы скрипта? Для чего в таблице reg2 дублировать данные из таблицы reg?
Если это просто активация аккаунта, то логично в таблице reg сделать столбец is_active = 0 (по умолчанию, не активирован), например, и после перехода пользователя по ссылке активации изменять флаг на is_active = 1
Держите нормальный вариант:
<?php
/*
Дамп БД
CREATE TABLE IF NOT EXISTS `reg` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(40) NOT NULL,
`password` varchar(40) NOT NULL,
`data` varchar(255) NOT NULL,
`is_active` int(11) NOT NULL DEFAULT '0',
`datetime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
*/
header('Content-Type: text/html; charset=utf-8');
$id = isset($_GET['id']) ? (int) $_GET['id'] : null;
$message_not_found = 'Система не может Вас распознать. Попробуйте зарегистрироваться повторно.';
$message_already_activated = 'Вы уже прошли процесс активации.';
$dbnx = mysqli_connect('localhost', 'root', '', 'reg');
if (!$id) {
exit($message_not_found);
}
$sql_query = $dbnx->query("SELECT id, is_active FROM reg WHERE id = '$id'");
if (!$sql_query->num_rows) {
exit($message_not_found);
}
if ($sql_query->fetch_object()->is_active) {
exit($message_already_activated);
}
$sql_query = $dbnx->query("UPDATE reg SET is_active = 1 WHERE id = '$id'");
?>
|
| |
|
|
|