2017-02-19 3 views
2

Я делаю некоторые функции API Войти с MySQLi подготовить и т.д.OpenCart Войти заказ апи с MySQLi подготовить

Надлежащей функцию входа, открытая телега с помощью, является следующей

$customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE LOWER(email) = '" . $this->db->escape(utf8_strtolower($email)) . "' AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))) OR password = '" . $this->db->escape(md5($password)) . "') AND status = '1' AND approved = '1'"); 

и я m пытается сделать это с инструкцией make mysqli со следующим кодом.

$result = mysqli_prepare($db, "SELECT customer_id, firstname, lastname, email, telephone, fax, address_id, customer_group_id FROM `oa_customer` WHERE LOWER(email) = ? AND password = ? OR password = ? ;"); 

$md5pass = md5($password); 
$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $password . "'))))" 
       echo "md5 "; 
       print_r($md5pass); 
       echo "new "; 
       print_r($newpass); 
       mysqli_stmt_bind_param($result, 'sss', utf8_strtolower($email), $password, $md5pass); 
       mysqli_stmt_execute($result); 
       mysqli_stmt_bind_result($result, $customerid, $firstname, $lastname, $email, $telephone, $fax, $address_id, $coustomer_group_id); 

       while(mysqli_stmt_fetch($result)) 
        {  
         $id = $customerid; 
         $name = $firstname; 
         $surname = $lastname; 
         $email = $email; 
         $phone = $telephone; 
         $fax = $fax; 
         $addressid = $address_id; 
         $customergroup = $customer_group_id; 

        } 
       mysqli_stmt_close($result); 
       mysqli_close($db); 

Моя единственная проблема эта линия

$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $password . "'))))" 

Который пытается представить следующий код первого исходного запроса авторизации

(password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))) 

В то время как я пытаюсь это я получаю ошибку 500 по запросу.

Вторая попытка заключалась в следующем.

Вместо использования

$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))" 

я заменил его

$newpass = sha1($salt . sha1($salt . sha1($password))); 

И снова 500 ошибок. Любая идея, что я должен сделать в моей mysqli, чтобы она была такой же, как исходный запрос?

Спасибо!

+0

** ПРЕДУПРЕЖДЕНИЕ **: Написание собственного уровня контроля доступа непросто, и есть много возможностей, чтобы заставить его серьезно ошибиться. Пожалуйста, не пишите свою собственную систему аутентификации, если какая-либо современная [инфраструктура разработки] (http://codegeekz.com/best-php-frameworks-for-developers/), например [Laravel] (http://laravel.com/) поставляется с надежной системой [authentication system] (https://laravel.com/docs/5.4/authentication). В абсолютном минимуме следуйте [рекомендуемым рекомендациям по безопасности] (http://www.phptherightway.com/#security). – tadman

+0

Использование SHA1, MD5 и других слабых хэшей - защита мусора. Смешивая его немного, чтобы быть «умным», добавляет нулевую безопасность, есть программы взлома, которые будут копить это и пробивать тысячи паролей в секунду, не нарушая пота. ** СДЕЛАЙТЕ ИСПОЛЬЗУЙТЕ ** и используйте ['password_hash'] (http://php.net/manual/en/function.password-hash.PHP). ** НЕ ПРИНИМАЙТЕ ** использовать домашний хеширующий код, подобный этому. – tadman

+1

Я тоже очень смущен, почему, если вы используете OpenCart, вам нужно пойти и написать свой собственный уровень входа. Вы можете объяснить? – tadman

ответ

1

Вероятно, что-то, как это должно работать:

$db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); 
$result = mysqli_prepare($db, " 
    SELECT customer_id, firstname, lastname, email, telephone, fax, address_id, customer_group_id 
    FROM `" . DB_PREFIX . "customer` 
    WHERE LOWER(email) = ? 
    AND password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(?))))) 
"); 
mysqli_stmt_bind_param($result, 'ss', $email, $password); 
mysqli_stmt_execute($result); 
mysqli_stmt_bind_result($result, $customer_id, $firstname, $lastname, $email, $telephone, $fax, $address_id, $customer_group_id); 

while(mysqli_stmt_fetch($result)) {  
    $id = $customer_id; 
    $name = $firstname; 
    $surname = $lastname; 
    $email = $email; 
    $phone = $telephone; 
    $fax = $fax; 
    $addressid = $address_id; 
    $customergroup = $customer_group_id; 
} 
mysqli_stmt_close($result); 
mysqli_close($db); 

md5 вариант в исходном запросе не является строго там для поддержки устаревших данных и больше не используется OpenCart для хранения паролей, так, если вы имеете дело со столом над Десятилетие, вы можете полностью отказаться от этой части. Также обратите внимание: вам не обязательно нужно избегать пароля, так как первый заказ sql-инъекции уже обрабатывается подготовленным оператором, поэтому должно быть безопасно просто передать исходный параметр $password в оператор.

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

$lastname = $this->customer->getLastName(); 
$fax = $this->customer->getFax(); 

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

+0

Я пробовал ваш пример, но все же он не работает. Я получаю ошибку 500. –

+0

if вы получаете ошибку 500, это проблема на уровне сервера и имеет отношение к чему-то еще в вашем коде. – billynoah

+0

Я думаю, что проблема заключается в том, что это один из SHA1 (CONCAT (соль, SHA1 (CONCAT (соль, SHA1 (?)))) ' –

Смежные вопросы