Pull to refresh

DataIncrement 2 — разрешение противоречий, ТРИЗ в реальной разработке

Reading time4 min
Views1.6K
В прошлый раз, из комментариев получилось выделить две конкретные проблемы проекта за что большое спасибо не равнодушным пользователям. Первая проблема — отсутствие SSL сертификата на сайте. И вторая, разглашение паролей доступа кому бы то ни-было — это крайне сомнительная идея.

Решение первой проблемы чисто техническое — установить бесплатный сертификат не вызывают больших сложностей.

А вот решение второй проблемы — исключить разглашение параметров подключения к своей базе данных — это вопрос.

Напомню, суть проекта — это онлайн клиент для базы данных mysql. Ключевой вопрос — подключение к базе данных, сразу вызывает несколько сложностей:

  1. Разглашение параметров подключения к базе данных;
  2. Даже в случае разглашения параметров не факт что получиться подключиться в силу административных ограничений, например разрешен только локальный доступ к базе данных.

В данной ситуации на лицо выресовывается техническое противоречие (ТП) в системе по тризу. Разглашать параметры нужно чтобы подключиться, но в тоже время разглашать параметры нельзя для безопасности. Кроме того разглашение параметров не решает вторую сложность — наличие административных ограничений.

В тризе один из моих любимых методов — метод идеального конечного результата (ИКР). Это сильнейший метод, который позволяет не боятся мыслить казалось бы абсурдно, но именно он позволяет порой добиваться желаемых результатов, там где казалось бы это не возможно вовсе.

Итак по тризу, я могу мысленно перевернуть задачу с ног на голову. И начать решать задачу с другого конца.

  • Было. Сайт хочет подключиться к вашей закрытой внутренней базе данных, и хочет сделать это без разглашения паролей доступа (Идеальный конечный результат).
  • А если наоборот. Сама база хочет подключиться к стороннему сайту, но не может этого сделать в силу административных ограничений.

С одной стороны получилась песня (ты на суше, я на море… нам не встретиться никак). С другой стороны, есть две силы которые хотят встретится, но не могут этого сделать.

Казалось бы какая суша, какое море? Причем тут базы данных и сервера. Но подождите. Все мы знаем, что часто бывает так что мальчик нравиться девочке и наоборот эта же девочка нравиться этому мальчику. Они боятся сделать шаг навстречу друг другу. Не могу сами сделать этого. Это невозможно. Но тут вдруг неожиданно у обих несчастных появляется общая подружка. Подружка знакомит и сводит двух стесняшек вместе. А дальше все само собой как-то получается.

Тут важно заметить, что без появления третьей силы не обойтись. Точно как по тризу — нужно ввести в систему третью силу (система из двух сил считается не полной) и достроить треугольник. Сводница выступила третьей силой и свела мальчика с девочкой.

Другой пример из политики. Есть Германия, которая хочет покупать топливо подешевле. Есть Иран, который хочет продавать топливо Германии. Но у Германии настроено жесткое административное ограничение на поставки топлива из Ирана. Достроим систему из двух сил до полного треугольника. Введем третью силу — это Россия. Которая может взаимодействовать как с Германией, так и с Ираном. В результате, Германия прекрасно взаимодействует с Ираном, через транспорт в лице России.

Итак третья сила необходима. Ведем третью силу в неполную систему из базы данных и клиента. В качестве транспорта будем использовать некий драйвер, который будет выполнять роль передаста (слово тут конечно грубоватое, но вполне уместное, если не зацикливаться на грубости).

Перечислим требования к нашему драйверу-транспорту. Собственно требований всего два:

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

Посмотрим на первое требование. Двум силам необходимо одно и тоже. А именно: нужно отправлять запросы и взамен получать набор данных для отображения. В качестве канала передачи данных используется естественно интернет.

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

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

Код


header('Content-Type: text/html; charset=utf-8');

# Key
$pass       =   'KEY_PASS_FROM_DATAINCREMENT';      //change for youself

# Connect parametres to mysql database
$host       =   'LOCALHOST';        //change for youself
$user       =   'USERNAME';         //change for youself
$password   =   'PASSWORD';         //change for youself
$database   =   'DATABASE_NAME';    //change for youself



# Access
if ( !isset($_POST['query']) )         die( 'no query' );
if ( @$_POST['pass'] != md5($pass) )   die( 'no pass' );
// if ( $_SERVER['REMOTE_ADDR'] != '185.229.9.9' ) die( 'no ip' );



# Connect
$mysqli     =   new mysqli($host, $user, $password, $database);

if ( $mysqli->connect_error )
{
    die( 'no connect: ' .$mysqli->connect_error );
}

# Character
$mysqli->set_charset( $mysqli->query("SHOW VARIABLES LIKE 'character_set_database'")->fetch_object()->Value );


# Query & Return
if ( $result = $mysqli->query($_POST['query'], MYSQLI_USE_RESULT) )
{
    for ( $rows = array();  $r = $result->fetch_array(MYSQLI_ASSOC);  $rows[] = $r );
    
    $rows   =   json_encode($rows);
    $rows   =   gzdeflate($rows, 9);
    
    die( $rows );
}

die( $mysqli->error );

Вот такой нехитрый получился драйвер. Теперь этот скрипт осталось разместить где-нибудь у себя на сайте в произвольном месте. И зарегистрировать этот драйвер на клиенте — dataincrement.com указав в качестве подключения к своей базе данных.

Таким образом получилось подключиться к базе данных без раскрытия параметров подключения в принципе. А так же минуя административные ограничения. Кроме того, драйвер получился настолько простым и понятным, что его можно легко доработать по собственному желанию и реализовать самостоятельно на другом языке, если это нужно. Например, добавить историю запросов или ограничить доступ только с определенных ip можно буквально в пару дополнительных строчек.

Заключение


На данном примере я постарался показать силу триза в разрешении казалось бы парадоксальных противоречий. Считаю, что здравый смысл и логические построения на которых базируется триз и наука логики рано или позно должны вытеснить собой засилие доморощенных церковников, евангелистов и пропагандистов. Для которых что ни бизнес то миссия, что ни проект то вера во все хорошее против всего плохого.
Tags:
Hubs:
Total votes 7: ↑4 and ↓3+1
Comments5

Articles