Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (5) [1] 2 3 ... Последняя » ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Улучшение кода
maax  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Пользователь
Сообщений: 119
Пользователь №: 41664
На форуме: 1 год, 9 месяцев, 19 дней
Карма:




Есть вот такой вот файл авторизации ,все вроде работает как надо но все равно чего то в нем не хватает или наоборот может что убрать,что посоветуете изменить? или не париться и оставить как есть

<?php
session_start();

if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }


if (empty($login) or empty($password))
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
}
$login = stripslashes($login);
$login = htmlspecialchars($login);

$password = stripslashes($password);
$password = htmlspecialchars($password);

$login = trim($login);
$password = trim($password);

include ("bd.php");

$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=='unknown')
{
$ip=getenv("REMOTE_ADDR");
}

$cnt->query("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");

$result = $cnt->prepare('SELECT col FROM oshibka WHERE ip = ? LIMIT 1');
$result->bindParam(1, $ip);
$result->execute();
$myrow = $result->fetch();
if ($myrow['col'] > 2)
{
exit ("Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки.");

}

$password = md5($password);
$password = strrev($password);

$sql[':login'] = $login;
$sql[':password'] = $password;

$query = $cnt->prepare("SELECT * FROM users WHERE `login` = :login AND `password` = :password AND `activation` = 1 LIMIT 1");
$query->execute($sql);
$myrow = $query->fetch();

if (empty($myrow['id']))
{

$tmp = $cnt->query("SELECT `ip` FROM oshibka WHERE `ip` = '".$ip."' LIMIT 1")->fetch(PDO::FETCH_NUM);

if ($ip == $tmp[0])
{
$row = $cnt->prepare("UPDATE oshibka SET col = col + 1,date = NOW() WHERE ip = ?");
$row->bindParam(1, $ip);
$row->execute();
}

else

{
$row = $cnt->prepare("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
$row->bindParam(1, $ip);
$row->execute();
}

exit ("Извините, введённый вами логин или пароль неверный.");

}

else

{

$_SESSION['sid']=$myrow['id'];

if (isset($_POST['autovhod']))
{
setcookie("auto", "yes", time()+9999999);
setcookie("sid", $myrow['id'], time()+9999999);}
}


echo "<html><head><meta http-equiv='Refresh' content='0; URL=index.php'></head></html>";

?>


Это сообщение отредактировал maax - 15.05.2016 - 13:37
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 9 месяцев, 23 дня
Карма: 147




if ($login == '') { unset($login);} } и ансет для пароля - совершенно лишнее
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Пользователь
Сообщений: 119
Пользователь №: 41664
На форуме: 1 год, 9 месяцев, 19 дней
Карма:




redreem это да,руки не дошли убрать раньше
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 9 месяцев, 23 дня
Карма: 147




лучше убрать связывание с html

echo "<html><head><meta http-equiv='Refresh' content='0; URL=index.php'></head></html>";


exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");


оформить в отдельный метод, который просто возвращает некий статус. а далее уже в зависимости от статуса что-то делать.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Старик
***

Профиль
Группа: Пользователь
Сообщений: 119
Пользователь №: 41664
На форуме: 1 год, 9 месяцев, 19 дней
Карма:




redreem

это понятно все,я с ajax потом сделаю как надо,чисто по php как вот ,безопасно ли сохраняется сессия? и т д,такие вопросы интересуют
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 9 месяцев, 23 дня
Карма: 147




соли к хэшу подмешай. данный вариант достаточно примитивен.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Пользователь
Сообщений: 159
Пользователь №: 42899
На форуме: 1 год, 25 дней
Карма: 3




количество иф...елсе и других строк тоже можно сократить


function postUser ($data)
{
$var = stripslashes($data);
$var = htmlspecialchars($data);
$var = trim($data);
return $var;
}

if (isset($_POST['login']) && isset($_POST['password']))
{
$login = postUser($_POST['login']);
$password = postUser($_POST['password']);

// проверка на соответствие
// авторизация или выброс ошибки

}
else
// вывод ошибки заполнения


в установке кук, лучше указывать домен.

Это сообщение отредактировал sg.com - 15.05.2016 - 14:29
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Миша  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 2632
Пользователь №: 37963
На форуме: 3 года, 9 месяцев, 13 дней
Карма: 29




Если есть
$password = md5($password);

То зачем
$password = htmlspecialchars($password);



--------------------
Принимаю заказы, писать в ЛС
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Astin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 592
Пользователь №: 42519
На форуме: 1 год, 3 месяца, 11 дней
Карма: 7




Полностью согласен с sg.com и Медведь

Плюс вот это еще лишнее
$password = stripslashes($password);


Ты же все равно хешируешь пароль
Да, и как maax выше сказал нужно "посолить" пароль

Что то вроде вот такого
//Соль пароля, любой набор символов 

define('SALT', 'gFty6bb^%9а;3@hJut');

$password = md5($password.SALT);


А так да, лучше избавиться от множества IF и else, а то сам запутаешься
и сделать примерно так ИМХО

<?php
session_start();

include 'bd.php';

if (isset($_POST['login'])) {

// Если логин передан, создаем переменные если надо

// Массив для ошибок

$error = array();

// Здесь проверяем на корректность заполнения полей

// К примеру


if (empty($_POST['login']))

$error[] = 'Вы не заполнили поле Логин';

// Если есть ошибки показываем
if (count($error))
{
echo implode("<br/>",$error);
}

// Если нет ошибок

if (!count($error))
{

// Авторизируем юсера, или показываем ссылку в кабинет или еще что

}
}


// Закрываем сессию
session_write_close();


Ну вот что то в этом духе
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1513
Пользователь №: 28976
На форуме: 5 лет, 9 месяцев, 24 дня
Карма: 86




Цитата (sg.com @ 15.05.2016 - 14:24)
function postUser ($data)
{
    $var = stripslashes($data);
    $var = htmlspecialchars($data);
    $var = trim($data);
    return $var;
}

if (isset($_POST['login']) && isset($_POST['password']))
{
    $login = postUser($_POST['login']);
    $password = postUser($_POST['password']);

ЗАЧЕМ применять trim к паролю, почему он НЕ должен начинаться и заканчиваться пробелом ?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Пользователь
Сообщений: 159
Пользователь №: 42899
На форуме: 1 год, 25 дней
Карма: 3




Цитата (Kusss @ 15.05.2016 - 17:29)
ЗАЧЕМ применять trim к паролю, почему он НЕ должен начинаться и заканчиваться пробелом ?

вопрос к автору темы, алгоритм не мой ), ну а вообще не очень хорошо использовать в пароле пробелы как в начале так и в конце.

Это сообщение отредактировал sg.com - 15.05.2016 - 18:13
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Santehnick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 263
Пользователь №: 26735
На форуме: 6 лет, 2 месяца, 15 дней
Карма: 15




Цитата (redreem @ 15.05.2016 - 10:10)
соли к хэшу подмешай. данный вариант достаточно примитивен.

Это не поможет. С сегодняшними мощностями его легко вычислить, md5 потребляет очень мало процессорного времени. Нужно использовать другие алгоритмы например скорость вычисления blowfish $2y$13 занимает порядка 1 секунды процессорного времени, что вполне приемлемо. И можно увеличивать стоимость вычисления по мере роста производительности. http://php.net/manual/en/function.crypt.php
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3647
Пользователь №: 38635
На форуме: 3 года, 4 месяца, 26 дней
Карма: 194




Цитата (sg.com @ 15.05.2016 - 16:11)
ну а вообще не очень хорошо использовать в пароле пробелы как в начале так и в конце

Чем пробел отличается от любого другого символа?
Более того, тримя пароль, ты создаешь сам себе проблеммы.
Как только ты протримил пароль и внес его в базу, тебе нужно всегда, в каждом новом методе, помнить, что пароль нужно тримить. И через 5 лет.
А если твой код попадет к другому разработчику, то он вообще волосы подмышками повырывает, непонимая, почему он регистрирется с одним паролем, а потом с тем же самым паролем не может залогиниться.

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


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8925
Пользователь №: 26630
На форуме: 6 лет, 2 месяца, 21 день
Карма: 603




Цитата (Kusss @ 15.05.2016 - 17:29)
ЗАЧЕМ применять trim к паролю, почему он НЕ должен начинаться и заканчиваться пробелом ?

и не только трим, все остальные модифицирующие функции тоже нельзя применять к паролю, чтоб не наступить на грабли о которых выше написал AllesKlar. Плюс удаляя из пароля символы, ты сокращаешь длину пароля, снижая его стойкость к перебору. Вообще если к паролю и должны быть требования, только направленные на повышение стойкости, а не наоборот, как любые запреты на используемые символы. Подобный абсурд можно частенько наблюдать, даже на крупных сайтах.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sg.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Пользователь
Сообщений: 159
Пользователь №: 42899
На форуме: 1 год, 25 дней
Карма: 3




Цитата (AllesKlar @ 15.05.2016 - 21:27)
Если не желаешь пробелы в паролях, то это должно быть ясно деведено до пользователя и пароль с пробелом в начале / в конце, должен отвергаться системой, а не тримиться втихаря и сохранять в базу, как валидный.

это да, можно просто написать возле поля - "пробелы в начале и в конце пароля буду удалены системой автоматически", а можно вернуть пользователю на исправление, мол "в начале или в конце введены пробелы, удалите их и повторите регистрацию ".
Цитата (AllesKlar @ 15.05.2016 - 21:27)
А если твой код попадет к другому разработчику, то он вообще волосы подмышками повырывает, непонимая, почему он регистрирется с одним паролем, а потом с тем же самым паролем не может залогиниться.

это то же да, пусть помучается поработает, пусть докажет что умеет biggrin.gif
Цитата (AllesKlar @ 15.05.2016 - 21:27)
Чем пробел отличается от любого другого символа?

у пробела есть отличие от любого другого символа, - это его "незаметность".

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

такой вопрос - как часть пользователи используют пробелы в начале или в конце пароля задумано? а если эти пользователи даже значения слов логин и аккаунт не понимают в принципе, насколько для них значимо использовать пробел, и вот тут как раз наоборот все обернется, случайно написавший пароль с пробелом, потом не сможет залогинится, так как пробел туда попал случайно, только это легко не заметить в отличии от других символов.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (5) [1] 2 3 ... Последняя » Ответ в темуСоздание новой темыСоздание опроса