пятница, 9 декабря 2022 г.

Debian web-server secure option

 php.ini
— allow_url_fopen = Off. Эта настройка отвечает за то, могут ли внешние файлы быть включены в ваш сайт. По умолчанию это разрешено, чтобы это изменить, кликните по флажку.
— allow_url_include = Off. Определяет, могут ли встроенные функции ссылаться на файлы, расположенные удаленно на других ресурсах.


P.S. Для того, чтобы сменить идентификатор в php вам нужно воспользоваться session_regenerate_id. В случае, если вы используете PHP 5.2 или выше, то для защиты от угона идентификатора вы можете воспользоваться таким функциями, как: session.cookie.httpolny и session_set_cookie_parms.

Debian web-service tips

 #Узнать локацию файла php.ini
php -i | grep php.ini

воскресенье, 4 декабря 2022 г.

Настройка ОС Debian после установки как web-сервера

Рассматривается настройка Debian 13 (Bookwork), в случае применения инструкции к другим версиям Debian, будет меняться только список репозиториев для установки ПО `sources.list`.

1. Проверяем списки репозиториев `sources.list`, источники из которых будет выполняться установка программ при использовании команд `apt` и `apt-get`: 
# nano /etc/apt/sources.list

В случае если первая строка файла имеет название источника CDROM, комментируем ее, добавив `#` в начало строки, и добавляем следующий список репозиториев для Debian 13 (Bookworm):
deb http://deb.debian.org/debian/ bookworm main non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main non-free-firmware

deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm-updates main non-free-firmware


2. Выполняем обновление используемых компонент ОС, включая компоненты безопасности: 
# sudo apt update
# sudo apt upgrade
# sudo apt full-upgrade
# sudo apt autoremove


2. Устаналвиваем `sudo`:
# apt install sudo -y


3. Устанавливаем Apache с привязкой модулей для работы с php:
# sudo apt-get install -y apache2 php php-mysql libapache2-mod-php php-mbstring php-zip php-gd

4. Устанавливаем сервер базы данных MariaDB
# sudo apt-get -y install mariadb-server mariadb-client mariadb-common

5. Каталог для распаложения *.php и *.html -файлов `/var/www/html`, index.html переименовываем в index.html_
# mv /var/www/html/index.html /var/www/html/index.html_

6. Создаем index.php
nano /var/www/html/index.php
<?php
    phpInfo();
?>

Настройка удаленного подключения к mysql (mariadb)

1. Создаем пользователя MariaDB

root@servername# sudo mysql -u root -p

mysql> CREATE USER 'user'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'user'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

mysql> quit;



2. Разрешаем подключения с удаленного хоста к серверу MariaDB

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Комментируем
#bind-address = 127.0.0.1

Добавляем
bind-address = 0.0.0.0



3. Перезапускаем сервис mysql

sudo service mysql restart

php move_uploaded_file failed to open stream: Permission denied

При обработке полученного файла php-скриптом (перемещении файла из временного каталога в наш каталог на стороне web-сервера) $_FILES получаем сообщение о недостаточности прав, например, как у меня "<b>Warning</b>:  move_uploaded_file(/var/www/html/upload_files/defect_attach/04_12_22_01_05_41_371_3374.zip): failed to open stream: Permission denied in <b>/var/www/html/engine/defect.php</b> on line <b>159</b><br />"


Шаг 1. Выясняем под каким пользователем выполняется наш php-скрипт на стороне сервера:
<?php echo exec('whoami'); ?>
...в моем случае это "www-data";

Шаг 2. Добавляем пользователя, под которым подключаемся 
к серверу для разработки в группу `www-data`:
sudo adduser <username> www-data

Шаг 3.
sudo chown -R www-data:www-data /var/www

Шаг 4.
sudo chmod -R g+rwX /var/www

вторник, 10 мая 2022 г.

Класс для логирования программы (RichTextBox), версия 2

Первая версия класса расположена по web-ссылке: RichTextBox_LoggedClass

Во вторую версию одноименного класса добавлено:

1. Логирование отладочного текста (*.log_dbg), по умолчанию оранжевого цвета (*.col_dbg). При логировании строки в компоненте RichTextBox не используется (timestamp( )) в начале добавляемого текста и не используются символы перевода строки ("\r\n") в конце текста.

2. Добавление текста в компонент RichTextBox выполнена через *.InvokeRequired, позволяющего работать из другого потока;

3. Также пространство имен в классе "Framework". Исключено имя разрабатываемого проекта (projectname.Framework);
Остальные методы работы остались без изменений:

Пример использования класса:
---------------------
...
using Framework;
...
class Class_Name {
    RichTextBoxLogClass log;
    public Class_Name() {
        log = new RichTextBoxLogClass(rtbLog);
    }
    
    ...
    public void button_click(...) {
        log.log_msg("Начало выполнения операции.");
        log.log_err("Ошибка выполнения операции");
        log.log_tx("ASCII CMD SEND TEXT");
        log.log_rx("ASCII CMD RECIVED TEXT");
        log.log_tx(new byte [] {0x01, 0x20, 0x44, 0x55});
        log.log_rx(new byte [] {0x01, 0x20, 0x44, 0x55});
        log.log_dbg("dbg chars " + BitConverter.ToString(new byte[] {0x01, 0x02, 0x03 }).Replace("-", " ");   
    }
}

Настраиваемые параметры:
------------------------
    log.col_msg - цвет текста сообщения, по умолчанию, Color.Gray;
    log.col_err - цвет текста сообщения об ошибке, по умолчанию, Color.Black;
    log.col_tx - цвет текста отправляемых данных, по умолчанию, Color.Red;
    log.col_rx - цвет текста принимаемых данных, по умолчанию, Color.Blue;
    log.log_dbg - цвет текста отладочного сообщения, по умолчанию, Color.Orange;
    log.timestampFormat - формат вывода времени, например, "HH:mm:ss.ff";
    log.bytes_in_line - количество байт в строке, например, 16;
    log.hex_to_ascii_space - расст между hex и ascii строк, напр. 8;

среда, 4 мая 2022 г.

Сохранение настроек программы в xml-файл

        ...
        string param1;
        string param2;
        string param3;
        bool flag1;
        ...

static class SaveAppSetting
{

    public static string fname_xml = @"\appSetting.xml";
    
    static XmlDocument doc;
    
    static public void LoadXmlAppSetting()
    {
        if (System.IO.File.Exists(fname_xml))
        {
            doc = new XmlDocument();
        
    doc.Load(fname_xml);
        
        
    param1 = getStringValue("/setting/equipment/param1");
            param2 = getStringValue("/setting/equipment/param2");
            param3 = getStringValue("/setting/equipment/param3");
         
            flag1 = getBoolValue("/setting/dbg/log_7e1_codeString");
        }
    }

    static public void SaveXmlAppSetting()
    {
        string xml_content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                             "<setting>";
        xml_content += "<equipment>";
        xml_content += "<
param1>" + param1 + "</param1>";
        xml_content += "<param2>" + param2 + "</param2>";
        xml_content += "<param3>" + param3 + "</param3>";

        xml_content += "<flag1>" + flag1.ToString() + "</flag1>";
        xml_content += "</equipment>";

        xml_content += "</setting>";
        try
        {
            doc = new XmlDocument();
            doc.LoadXml(xml_content);
            doc.Save(fname_xml);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    static private string getStringValue(string xml_path, string default_value = "-")
    {
        string ret_value = "";
        try
        {
            ret_value = doc.SelectSingleNode(xml_path).InnerText.Trim();
        }
        catch
        {
            ret_value = default_value;
        }
          
        return ret_value;
    }
    
    static private bool getBoolValue(string xml_path, bool default_value = false)
    {
        bool ret_value = false;
        
        try
        {
            ret_value = Convert.ToBoolean(doc.SelectSingleNode(xml_path).
                                                                 InnerText.Trim());
        }
        catch
        {
            ret_value = default_value;
        }
        
        return ret_value;
    }
}

Nginx + Let's Crypt

Шаг 1. Установка Certbot # apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing...