Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...



PHP 5.5 предлага нов начин за хеширане на пароли с сол. Тази техника се използва отдавна, но за получаване на желан резултат се изискваше много действия или прибягване до допълнителни библиотеки. Разработчиците идват на помощ, като въвеждат две нови функции в PHP 5.5 за целта.
  • password_hash
  • password_verify
Нека разгледаме как работят.

Действията се свеждат до създаване на лаконична база данни и подобен php-код.


Създаване на база данни и таблица

-- изтриване на test, ако съществува
-- DROP DATABASE `test`;

-- създаване на test
CREATE DATABASE IF NOT EXISTS `test` 
CHARACTER SET utf8 
COLLATE utf8_general_ci;

-- създаване на таблица users
CREATE TABLE IF NOT EXISTS `test`.`users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(60) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

-- въвеждане на инфо
INSERT INTO `test`.`users` (`id`, `username`, `password`) 
VALUES (1, 'profruit', 'butterfly');

-- заявка
SELECT * FROM `test`.`users` LIMIT 1;
В резултат на поредицата команди получаваме това.

таблица users

Ясно, че съхранението на пароли в открит вид в базата данни е глупаво. Ела кумчо изяж ме!

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

Създаване на тестови сайт

Копирайте всеки един файл, посочен долу и създайте подобна структура на вашия сървър.

Съдържанието на сайта за придобиване на представа.

сайт отвътре

Файл config.php съдържа константи, а те пък нужните имена и пароли за съединение към конкретната база данни.

config.php
<?php
 // конфигурация на база данни
 define("DB_SERVER", "localhost");
 define("DB_USER", "johnsmith");
 define("DB_PASS", "hackerpassword");
 define("DB_NAME", "test");

Файл convert.php хешира паролата.
Той ще извлече паролата от базата данни. Ще я отпечата в браузъра, след което хешира с помощта на функция password_hash() и отново отпечата в браузъра за съпоставка преди-после. На края ще обнови паролата в хеширан вид в базата данни.

хеширана парола

Солта (YoKo%jOhn&*;!*1234<butt$>?) е произволен набор от символи, не по-малко от 22 на брой. Тя е поместена в константа SALT и е плод на вашето въобръжение. Солта остава в php-файл, далеч от базата данни и това усложнява задача на злоумишленика. А при повишена параноя може да се изнесе в файл зад пределите на root-директорията на сървъра.

PDO e използвано в качеството на пример и всякакви коментари около него се приветсват. За простота на кода се налага ограничение от изпълнение на този файл само веднъж, иначе ще хеширате отново.

Най-отдолу има хиперлинк, който ще ви отведе към файла за сравнение на паролите. Преминете по него.

convert.php
<?php include ('pdo.inc.php'); ?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
    <title>конвертитане на паролата</title>
</head>
<body>

 <p>Парола в чист вид: <?= $password?></p>
    <p>Парола с сол: 
  <?php
   // СОЛ - 22 произволни символа
   DEFINE("SALT", "YoKo%jOhn&*;!*1234<butt$>?");
   
   // хеширане на паролата
   echo $hashPassword = password_hash($password, PASSWORD_BCRYPT, ['salt' => SALT]);
  ?>
    </p>
 <?php
  // чист вид
  // UPDATE `test`.`users` SET `password` = 'butterfly' WHERE `users`.`id` =1;
  
  // обновена с сол
  $sql = "UPDATE users SET password = :password WHERE id = :id";
  $istmt = $db->prepare($sql);
  $istmt->execute([':password' => $hashPassword, ':id' => $id]);
 ?>
 
 <a href="./verify.php?password=">сравнение на паролите</a>
</body>
</html>

За елегантност и по-удобна читаемост отделяме файл pdo.inc.php, като самостоятелен. Той се включва в началото на convert.php. Коментарите следва да ви ориентират.

pdo.inc.php
<?php
 // съединение с база данни
 require ('config.php');
 $db = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME, DB_USER, DB_PASS);
 
 // заявка и подготовка
 $sql = "SELECT * FROM users LIMIT 1";
 $stmt = $db->prepare($sql);
 
 // изпълнение
 $stmt->execute();
 
 // подстановка на полетата в променливи
 $stmt->bindColumn('id', $id);
 $stmt->bindColumn('username', $username);
 $stmt->bindColumn('password', $password);

 $stmt->fetch()
?>
Резултат от действието на convert.php.

хеширане на паролата

Забележете адреса в статус бара, към когото ще бъдете пренасочени, а там ви очаква следния прозорец на вид.

сравняване на паролата

Този прозорец се изрисува от файл verify.php.

verify.php

<?php include ('mysqli.inc.php'); ?>

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
    <title>сравнение</title>
</head>
<body>
  <?php if(empty($pass_from_url)): ?>
        <p>въведете парола</p>  
    <?php elseif (password_verify($pass_from_url, $pass_from_db)): ?>
        <i>вярна парола</i>
    <?php else: ?>
        <i>невярна парола</i>
    <?php endif; ?>
</body>
</html>

Файлът съпоставя значенията на хешираната парола от базата данни с въведената в адресното поле на браузъра. Работейки по този начин отпада нужда от форма за въвеждане.

mysqli-драйверът е ползван в качеството на пример, в стил процедурен код. А изяществото налага разделяне на php-кода от html в отделен файл mysqli.inc.php. Коментарите по кода ще ви въведат в обстановката.


mysqli.inc.php
<?php 
 // URL заявка
 $url = @rtrim($_GET['password']);
 $pass_from_url = isset($_REQUEST['password']) ? $url : '';
 
 if(!empty($pass_from_url)){
  
  // съединение с база данни
  require ('config.php');
  $connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
 
  // успех на съединението
  if(mysqli_connect_errno()) {
   die("Database connection kaput.");
  }
 
  // DB заявка
  $sql = "SELECT password FROM users LIMIT 1";
  $query = mysqli_query($connection, $sql);
 
  // обработка на резултата
  $result = mysqli_fetch_assoc($query);
  $pass_from_db = $result['password'];
 
  // освобождаване на ресурси
  mysqli_free_result($query);
  mysqli_close($connection);
  
  // въведена парола
  echo "{$url} е: ";
 }
?>

И нека пробваме с произволна парола hacker92. Резултат.

невярна на паролата

А сега въведем вярната парола butterfly.

вярна на паролата

Bingo!

извор:
Password Hashing
Salted Password Hashing





до нови срещи   ^.^
19.10.2013 profruit 
| |

Все още няма комплект под Windows 7, предлагащ PHP 5.5 и Apache 2.4 към датата на публикация. Визирам XAMPP, Denwer 3 и прочие подобия. Затова реших да покажа на Windows - потребителите как всеки един от вас може да инсталира PHP 5.5 с минимум усилия и време.

Обещавам ви, че в края на публикацията вие ще забравите изброените пакети и моя показ ще ви лепне на сърцето. Така че, ако вие подобно на мене се изкушавате от новостите в PHP 5.5 нека извървим пътя до край.

Подготовка

Налична система Windows 7 Home Premium Edition 64bit SP1, лицензирана, на иврит.
Моля, обърнете внимание, че системата ми е 64 разрядна, а това определя изтеглянето на съответните по разряд приложения. Ако вие сте на 32-битов Windows, то изтеглете приложенията за този тип.

Първа спирка е
http://windows.php.net/download/

На този ресурс под бутон Download се намира падащ списък, изброяващ версия PHP съобразно разряда. Аз избрах VC11 x64 Thread Safe (2013-Sep-18 23:44:20), като изтеглих zip архив на име php-5.5.4-Win32-VC11-x64.zip.

Не случайно написах името, което съдържа VC11 в частта си. Това ще бъде жокер за версията на Apache, която ще изтеглим за Windows.

Втора спирка
http://www.apachelounge.com/

Преминаваме в раздел Downloads и търсим раздел VC11, след което попадаме в Apache 2.4 binaries VC11 и под надпис Apache 2.4.6 Win64 изтегляме архив httpd-2.4.6-win64-VC11.zip.

Тук следва да се уверите в следната препоръка:
Be sure that you have installed Visual C++ Redistributable for Visual Studio 2012 : VC11 vcredist_x64/86.exe

VC11 vcredist_x64/86.exe
ще даде възможност Apache, да стартира при зареждане на Windows и ще включи сървъра в администрацията на службите. Отново подбираме вариант за 64 битова система и изтегляме VSU3\vcredist_x64.exe.

При успех на обичайната за Windows инсталация изплува подобен прозорец.

Visual C++ Redistributable for Visual Studio 2012

Инсталация на PHP 5.5 и Apache 2.4

Разопаковаме архива на Apache (httpd-2.4.6-win64-VC11.zip). Папка Apache24 включително съдържанието й местим на работното място. За себе си реших да бъде на системния диск - C:/.

Разопаковаме архива на PHP (php-5.5.4-Win32-VC11-x64.zip), Получената папка на име php-5.5.4-Win32-VC11-x64 преименуваме в краткото php. Тази папка също местим в C:/.

Инсталация на PHP 5.5 и  Apache 2.4

Следва да научим Apache, че към него ще бъде включен модул PHP. В папка C:\Apache24\conf отваряме файл httpd и добавяме в самия край на файла следните три реда:
LoadModule php5_module "C:/php/php5apache2_4.dll"

AddHandler application/x-httpd-php .php

PHPIniDir "C:/php"
Първият новодобавен ред указва на Apache, да зарежда модул php5. Втори ред указва как да обработва файлове с разширение *.php. А трети ред указва къде лежи конфигурационен файл php.ini. Съхраняваме измененията и преминаваме в папка php. Търсим файл php.ini-development, когото преименуваме в php.ini. По този начин активираме PHP.

Създаване на служба на Apache 2.4

Стъпка от последните ни действия е създаване на служба на Apache, която ще стартира с зареждане на Windows.

Стартираме командния ред cmd с администраторски права. Преминаваме в каталог C:\Apache23\bin и създаваме служба, чрез следната команда
httpd -k install

създаваме служба

Ще изскочи прозорец предупреждение, когото ще позволим,

прозорец предупреждение

а след него конзолата ще рапортува за успех.

успешно създадена служба

Отлично. Преминаваме в контролния панел и отваряме администрацията на службите. Трябва да видите служба на Apache.

служба Apache

Вижда се, че при мен е налична с автоматичен старт, но не е пусната. Типично за windows са нарисувани бутони старт/стоп и съответно щракаме по тях за желано действие.
И ако отворим браузър на адрес localhost ще прочетем радостното съобщение It Works.

It Works

Остана да проверим работоспособността на PHP. В папка C:\Apache24\htdocs добавяме файл index.php с съдържание echo phpinfo(); и стискаме палци.

PHP Works

Бинго! И съответно GAME OVER!





до нови срещи   ^.^
11.10.2013 profruit 

PHP порасна до версия 5.5 и това ме изкуши (към дата на публикацията) да го инсталирам на поредна моя машина.

PHP 5.5 изисква Apache 2.4.

До този момент разполагах с Apache 2.2.14 и модул PHP 5.4.17. Те бяха инсталирани по начин описан в тази публикация. Реших да премахна всичко и да започна начисто. Нещата се свеждат до същите команди, като израза install се замества с израза remove -y --purge.

Деинсталация на стара версия

спиране на Apache демона.
sudo service apache2 stop

изтриване на phpMyAdmin
sudo apt-get remove -y --purge libapache2-mod-auth-mysql phpmyadmin

изтриване на PHP 5.4.17
sudo apt-get remove -y --purge libapache2-mod-php5

изтриване на Apache 2.2.14
sudo apt-get remove -y --purge apache2

профилактика на пакетите
sudo apt-get autoremove
sudo apt-get autoclean

Инсталация на PHP 5.5 и Apache 2.4

Все още (към дата на публикацията) хранилищата на Ubuntu/Debian не предлагат въпросните версии и нещата ще бъдат инсталирани от нашите ръчички, благодарение на Ondřej Surý. Начинът описан тук е един от многото споделени в интернет. Считам го за лаконичен и при мен той работи. Както се казва, ползвайте на ваш риск и страх.

добавяне на lauchpad - хранилището към работната система
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php5

обновяване на системата
sudo apt-get update

инсталация на Apache 2.4
sudo apt-get install apache2

инсталация на PHP 5.5
sudo apt-get install php5

Това е всичко. Проверяваме резултата.

PHP 5.5 и  Apache 2.4 в Ubuntu

Инсталация на phpMyAdmin

инсталация на phpMyAdmin
sudo apt-get install phpmyadmin

проверяваме
http://localhost/phpmyadmin

Apache 2.4 идва с редица различия от версия 2.х.х и първоначално phpMyAdmin не изгря (дори след принудителни рестарти на сървъра. Лечението се свежда до добавяне в края на файл:
/etc/apache2/apache2.conf

следния запис
Include /etc/phpmyadmin/apache.conf

рестарт на Apache 2.4
sudo /etc/init.d/apache2 restart

и се любуваме на следната картина.

phpMyAdmin 3.4.11

този маньовър ме надари с по-нова версия на phpMyAdmin.




до нови срещи   ^.^
11.10.2013 profruit 
| |

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: openHAB, Ubuntu, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога