Простой PHP класс авт обратной связи


это простой PHP-авт класс я собрал для использования с простыми сайтами я делаю время от времени, не гарантирует использование рамок. Мне интересно, если я разделив обязанности, все что хорошо, даже на этой ранней стадии! Например, я не уверен, где я должен быть фильтрация пользовательского ввода с использования mysql_real_escape_string, и я не знаю, если я должен проходить БД в конструкторе, но тогда мне это нужно, чтобы быть в состоянии запустить мой двиг проверить.

В любом случае, любой указатели было бы здорово спасибо!

class Auth {

    protected $db;

    /**
     * Auth::__construct()
     * 
     * @return
     */
    public function __construct($db = null)
    {
        $this->db = $db;
    }

    /**
     * Auth::login()
     * 
     * @param mixed $username
     * @param mixed $password
     * @return
     */
    public function login($username, $password)
    {
        $query = $this->db->query("SELECT username, password 
                                    FROM users 
                                    WHERE username = '".mysql_real_escape_string($username)."'
                                    AND password = '".self::crypt_pass(mysql_real_escape_string($password))."'
                                  ");

        $result = $this->db->fetch_array($query);

        if (count($result) == 0)
        {
            return FALSE;
        }
        else
        {
            //set session variable 
            Session::instance()->set('logged_in', TRUE);
            return TRUE;
        }
    }

    /**
     * Auth::logout()
     * 
     * @return
     */
    public function logout()
    {
        //set session variable 
        return Session::instance()->delete('logged_in');
    }

    private function crypt_pass($pass)
    {
        if (CRYPT_BLOWFISH == 1)
        {
            $salt = SHA1('acssalty457');
            $blowfish_salt = "\$2a\$07\$".substr($salt, 0, CRYPT_SALT_LENGTH);
            return crypt($pass, $blowfish_salt);
        }
    }
}


Комментарии
3 ответа

Эта часть не имеет смысла для меня:

private function crypt_pass($pass)
{
if (CRYPT_BLOWFISH == 1)
{
$salt = SHA1('acssalty457');
$blowfish_salt = "\$2a\$07\$".substr($salt, 0, CRYPT_SALT_LENGTH);
return crypt($pass, $blowfish_salt);
}
}

Функции, которые возвращают только при условии-это плохая идея. Ты в любом случае должен что-то вернуть, даже если она ложная. Теперь о конкретной проблеме, что если CRYPT_BLOWFISH != 1? Это нормально, хотят использовать blowfist, но зачем калечить библиотека для всех остальных? Можно переписать как:

private function crypt_pass($pass) {
$salt = "acssalty457";

if (CRYPT_BLOWFISH == 1) {
$blowfish_salt = "\$2a\$07\$" . substr($salt, 0, CRYPT_SALT_LENGTH);
return crypt($pass, $blowfish_salt);
}

return sha1($pass . $salt);
}

Заметьте, что я не хэш-соль? Потому что безопасность мудрый, что это бесполезно. Вы можете поспрашивать в криптографии стека обмен на более. Если вы хотите принять в SHA1 кодировка пройти немного сложнее, вы могли бы сделать что-то странное, как:

return sha1(strrev($salt) . $pass . $salt);

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

3
ответ дан 12 ноября 2011 в 03:11 Источник Поделиться

Не знаете, какая версия PHP была реализована, но вам не нужно использовать метод__Construct, вы можете использовать для авторизации вместо этого, как и многие другие ООП Лэнг.

Вы должны проверить, Если $этом->дБ - это значение null , прежде чем делать любые SQL для работы, в противном случае логин будет выполнена с ошибками при использовании.

Еще одна вещь, вы должны смотреть на это с помощью ПДО (или то, что поддерживает подготовленные выражения). использования mysql_real_escape_string не является безопасным в эти дни.
http://php.net/manual/en/book.pdo.php

Вы также должны фильтровать электронную почту и пароль, используя выражения (функции preg_match) или в PHP функция фильтра: http://www.php.net/manual/en/filter.examples.sanitization.php
http://www.php.net/manual/en/book.filter.php
http://www.php.net/manual/en/function.filter-input.php

1
ответ дан 20 июля 2011 в 04:07 Источник Поделиться

Попробуйте эти иглобрюх функции-оболочки для размера:

https://gist.github.com/1151912

Они заворачивают функциональные возможности, ограничить его туда, где он доступен (в PHP 5.3), и предоставить хэш-функция генерации, а также Тест для проверки хэш Blowfish или нет, что делает его легче перейти от ранее хэш-системы до новой хэш-системы.

И да, пропустите использования mysql_real_escape_string и двигаться к параметризованные запросы от ПДО, тебе будет лучше:

У меня просто есть набор параметризованных ПДО фантик функции такой:

query('select * from users where user_id = :user_id', array(':user_id'=>$user_id));

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

1
ответ дан 13 ноября 2011 в 06:11 Источник Поделиться