hasło w formularzu logowania na stronie

0

Witam
Szukałem ale nie znalazłem.
Napisałem sobie własnego menadżera haseł. Wszystko jest szyfrowane i zapisywane w bazie access. Strony się otwierają i tutaj zastosowałem taki kod

  ClipBoard.AsText := DBGrid1.DataSource.DataSet.FieldByName('login').AsString;
  strona1 := DBGrid1.DataSource.DataSet.Fields[7].AsString;
  if (Pos('http://', strona1) = 1) OR (Pos('https://', strona1) = 1) then
    ShellExecute(Handle, PChar('Open'), PChar(strona1), nil, nil, SW_SHOWNORMAL)
  else
    ShellExecute(Handle, PChar('Open'), PChar('http://' + strona1), nil, nil,
      SW_SHOWNORMAL);

Moje pytanie jest takie. Jaki zastosować kod aby strony się otwierały i pole login i hasło w formularzu logowania sam się wypełniał?

3

jak się nie mylę to aktualnie nie ma możliwości "dostania" się do przeglądarki z programu zewnętrznego (sandboxy robią swoje). Kiedyś tak było (np. Roboform tak robił). Aktualnie jak chcesz wypełniać pola na stronach to musisz napisać rozszerzenie do przeglądarki które oczywiście że może korzystać z twoich danych nawet z bazy access (chociaż ja bym chyba bardziej celował w jakąś inną bazę np. sqlite).

2

Przeglądarki implementują Windows Automation API https://learn.microsoft.com/en-us/windows/win32/winauto/windows-automation-api-portal można się dostać do kontrolek i sprawdzać ich stan, prawdopodobnie też je ustawiać ale nigdy nie próbowałem.
Łatwiej to zrobić (i zadziała to na różnych platformach nie tylko na windows) korzystając z web drivera, chyba można skorzystać z gotowych driverów na przykład dostarczanych przez np selenium.

2

keepass ma osobną wtyczkę do przeglądarki a z menadżerem łączy się na wystawionym porcie. Jak oni tak to mają (lata doświadczenia) to pewnie nie da się bezpośrednio albo nie jest to wsakazane.

1

Ciężki temat ... ja robiłem to prościej czyli miałem TWebBrowser i w nim możesz robić co chcesz nawet JS wstrzykiwać więc jest łatwiej. Jak masz zewnętrzną przeglądarkę to może być trudniej bo nie wiesz do końca w czym i jak została napisana. Może być jednak prościej bo dana strona może udostępniać swojego rodzaju API do logowania.

0
woolfik napisał(a):

Ciężki temat ... ja robiłem to prościej czyli miałem TWebBrowser i w nim możesz robić co chcesz nawet JS wstrzykiwać więc jest łatwiej. Jak masz zewnętrzną przeglądarkę to może być trudniej bo nie wiesz do końca w czym i jak została napisana. Może być jednak prościej bo dana strona może udostępniać swojego rodzaju API do logowania.

Czy masz gotowy kod do komponentu TWebBrowser? Możesz go podrzucić?

4

I trudny i ciekawe, ale jeśli hackerskie rozwiązania odpadają to można w takim webbrowserze szukać na danej stronie XPathem po type="password" name="user", chodź to znajdzie ci javascriptem w tym WebBrowserze.

Bezpośrednio do danej przeglądarki, akurat się nie próbowałem dostać, ale pójdzie, może dostęp do drzewa DOM dla danej zakładki nie będzie oczywisty i oczywiście nie przenośne, bo każda przeglądarka jest inna budową i każdy system operacyjny.

Możesz też jakoś z pluginem do przeglądarki to połączyć ze swoim programem, że będzie na wszystkich stronach match: * szukał inputów typu password i username, i dla danej domeny podkładał wartości w te inputy.

0

Już wiem jak to się robi. Dzisiaj siedziałem w nocy i to zrobiłem. Dodałem na nową formę przeglądarkę komponentem EdgeBrowser1. Dodałem sobie przycisk z funkcją zaloguj

function zaloguj(): String;
var Script: string;
begin
  Script:= 'var login = document.getElementById("login");var password = document.getElementById("password"); login.value = "'+hasla2_.login2+'"; password.value = "'+hasla2_.password2+'"; console.log("ok");const firstForm = document.querySelector("form");firstForm.submit();';
  przegladarka_.EdgeBrowser1.ExecuteScript(Script);
end;

To nawet działa lepiej od przeglądarek Firefox i Chrome bo wysyła jeszcze formularz. Tak jakbym nacisnoł przycisk zaloguj.

0

Eh nie do końca. Nie wszystkie formularze są wypełniane i wysyłane. Bardziej uniwersalnie jest tak

public
    login2, password2: String;
    
function zaloguj(): String;
var Script: string;
begin
  Script:= 'var sp_login1 = document.querySelector("input"); var sp_password1 = document.getElementById("password");'+
'if (sp_login1 == undefined){var sp_login2 = document.getElementById("login");sp_login2.value = "'+hasla2_.login2+'";}else{sp_login1.value = "'+hasla2_.login2+'";}'+
'if ((sp_login1 == undefined) && (sp_login2 == undefined)){var sp_login3 = document.getElementById("email");sp_login3.value = "'+hasla2_.login2+'";}'+
'if (sp_password1 == undefined){var sp_password2 = document.getElementById("pass"); sp_password2.value = "'+hasla2_.password2+'";}else{ sp_password1.value = "'+hasla2_.password2+'";};'+
'var sp_firstForm = document.querySelector("form"); sp_firstForm.submit();';
  przegladarka_.EdgeBrowser1.ExecuteScript(Script);
end;

Ma ktoś pomysł jak to jeszcze bardziej uniwersalnie zapisać. Nie wszystkie formularze są wysyłane...

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