[PHP] Login sicuro al web Service SOAP

  • Creatore Discussione Creatore Discussione w_t
  • Data di inizio Data di inizio

w_t

Utente Attivo
3 Set 2007
121
0
16
Salve,
Potreste dirmi cosa si intende per "login sicuro" tra Client e Server dove gira un web service soap in php??

Mi hanno chiesto se il mio client in php esegue una autenticazione sicura all'arrivo nel server...!!

Come è progettata la logica/dinamica di un login sicuro ???
 
- No! Non il protocollo di comunicazione, li è ovvio che lavoro con https.

- Si credo che tu abbia centrato il punto, io non conosco bene i webservices, ma sono costretto ad usarli, io mi autentifico normalmente come un normalissimo login quando chiamo il server, non so se è questo che intendi...

- Dici che non è sicuro? Mi dici in due parole perchè?

Il mio problema è questo:
sviluppo ad oggetti e devo lasciare tutte le mie classi nel server, dato che ci saranno molte centinaia di pc-client in giro, devo potere lavorare con quelle classi dal client stesso, l'unico modo per fare questo credo sia i webservices.
 
Perchè utilizzare SOAP invece di creare un server RestFull?
Qui spiego come utilizzare un framework che puoi tranquillamente integrare con la tua applicazione!
 
Lavorando ad oggetti mi piace gestire i metodi delle mie classi da remoto.

Mi sono informato un pochino, non troppo..., ho visto che SOAP è più sicuro anche se più pesante di RestFull.

Io ho circa 15 classi con di media 10 metodi da gestire ciascuna, come posso riorganizzare tutto con RestFull??
RestFull sono semplici chiamate GET fatte con HTTP_Request, giusto ? Non sono facilmente intercettabili?

Non è una critica, è una domanda, io non conosco bene le differenze più critiche dei due metodi.
 
Ok, ti chiedo un ultimo sforso, potresti indirizzarmi a qualche link per imparare Restfull da zero, io ne ho trovati molti ma ogniuno come al solito dice la sua, ogniuno scrive e adotta lo stile che vuole, tu se non sbaglio conosci bene la materia, indirizzami allo stile giusto e maggiormente utilizzato.
 
Ho visto ma vorrei andare per il classico curl.

Posso chiederti una cosa:
ho fatto questo script per effettuare il login nel mio sito alla pagina "login.php", vorrei che se il login è corretto restituisse "Hello World", poi da qui lo implemento a dovere chiaramente.

Solo che non so come deve essere lo script che valida il login dal curl...

PHP:
$url = 'https://www.mio-sito.it/login.php';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, "D:\Ampps\www\certificate\ActalisAuthenticationRootCA.crt");

curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

$response = curl_exec($ch);
curl_close($ch);

print_r($response);
 
CURLAUTH_BASIC
Non è un metodo sicuro per effettuare il login! La parola stessa lo indica, indubbiamente è abbastanza forte, ma non è il massimo...
Ripeto, prova ad utilizzare un framework tipo CodeIgniter con la libreria ion_auth ha lo strato di login abbastanza complesso e di facile gestione.
Puoi anche wrappare la login come fosse un servizio, quindi senza che restituisce una view... Sto dando per scontato che utilizzi il pattern mvc, in quanto la creazione di un sistema di login non si fa a "spaghetti code", ma deve essere pensato a dovere...
Se il tuo scopo è solo quello di capire allora va benissimo anche così.
Ti segnalo invece di utilizzare curl, GUZZLE, wrappa esattamente curl ed ha anche la possibilità di avere un log delle operazioni/errori...
Solo che non so come deve essere lo script che valida il login dal curl...
Fermati e ragiona prima di buttare codice a go go....
Ipotizziamo che tu debba effettuare una login da remoto attraverso una chiamata.... Come ti comporti???
Lato Client:
- Invio una chiamata al server con username e password
- Mi aspetto un qualche parametro per la sessione alla quale sto accedendo

Lato Server:
- Mi aspetto delle credenziali in un determinato modo
- Verifico tali credenziali sulla mia base di dati
- Effettuo le operazioni dovute
- Memorizzo in una variabile temporanea o sul db in modo persistente i dati di sessione per l'utente
- Rispondo con un'obj del tipo {"login":true,"user":1,"session_id":"23812u39128u319","exired":11125125+3600}

Lato Cliente:
- Data la risposta effettuo qualche operazione ed effettuo il redirect o altro verso le nuove risorse.

Più o meno in modo molto semplice questo è il trace del login.
 
Prima di tutto ti ringrazio per la tua pazienza e perchè mi stai dando informazioni preziose.

Sto dando per scontato che utilizzi il pattern mvc, in quanto la creazione di un sistema di login non si fa a "spaghetti code", ma deve essere pensato a dovere...

-- non uso nulla, è un sistema chiuso, va realizzato e rimarrà per sempre così, sotto ti spiego perchè.

Lato Client:
- Invio una chiamata al server con username e password
- Mi aspetto un qualche parametro per la sessione alla quale sto accedendo

Lato Server:
- Mi aspetto delle credenziali in un determinato modo
- Verifico tali credenziali sulla mia base di dati
- Effettuo le operazioni dovute
- Memorizzo in una variabile temporanea o sul db in modo persistente i dati di sessione per l'utente
- Rispondo con un'obj del tipo {"login":true,"user":1,"session_id":"23812u39128u319","exired":11125125+3600}

-- Perfetto, hai centrato l'obiettivo, voglio proprio questo, neppure un passaggio in più.

Lato Cliente:
- Data la risposta effettuo qualche operazione ed effettuo il redirect o altro verso le nuove risorse.

-- Questa non 'ho capita, comunque passo a spiegarti il mio progetto:

Server: Computer in Housing su farm (Aruba credo), SO Linux Centos
- in questo server gira un Back Office + le classi che mi necessiteranno per la comunicazione con i Client
- qui ci sono pure delle API REST per effettuare transazioni bancarie

Clients: Una svariato numero di Computer SB (Odroid XU4), credo che nell'anno raggiungeranno i 500, collocati in giro per l'Italia
- In questo PC gira "Ubuntu X64 Desktop"
- in questo pc girano nel proprio server LAMP delle pagine php per un interfaccia grafica dove l'utente fa delle operazioni.
- Tutte le classi che compiono "Inserimenti/Modifiche/Eliminazioni/Transazioni/Etc.." risiedono nel server remoto per ovvi motivi, quando l'utente compie una qualsiasi operazione nell'interfaccia client, si devono effettuare chiamate "sicure e autenticate" al server, in modo interagire con le dovute classi, quindi infine occorre una risposta di ritorno per l'avvenuta operazione.

Dato che nel server si effettuano pure transazioni bancarie, avevo pensato di utilizzare SOAP vedi discussione iniziale, ma poi siamo arrivati a REST con CURL.

Tu ritieni che un Client che interroga il Server su protocollo HTTPS, con la funzione curl avendo le opzioni
CURLOPT_SSL_VERIFYPEER = true
CURLOPT_SSL_VERIFYHOST = 2
CURLOPT_CAINFO = certificato.crt
CURLOPT_USERPWD = 'user : pass'
CURLOPT_HTTPAUTH = CURLAUTH_NEGOTIATE
in questa ultima opzione vedi il link: https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html

non sia sufficente per la sicurezza?

Se fossero sufficenti, il mio problema è il seguente:

come gestisco lo script nel Server che accoglie la richiesta dal Client?
come si raccolgono le variabili che invia il Client?

Sono 18 anni che sviluppo in PHP e C# ma non ho mai affrontato una cosa come questa, mi ha spiazzato, proprio a zero non sono, mi spiego male a volte ma rimanere con le mani in mano cosi non me lo aspettavo.

Grazie ancora per la pazienza.
 
e se rubano un computer (client) ?????
Basta autenticare la macchina remota, o in alternativa mettere le macchina sotto una DMZ o ancora meglio M2M... Ma vabbè, sconfiniamo da quello che è il post.
In questi casi se rubassero una macchina Client, prima di ogni cosa sarebbe la macchina server a identificare/individuare il problema, quindi parliamo di una cosa inutile e soprattutto una buona progettazione sicuramente ha valutato mettendo in campo altre figure oltre al programmatore.

Faccio notare che qui non parliamo più di programmazione, si parla di sistemisti, di analisi dei flussi, e credo che così in modo pubblico non sia il caso di parlarne, questa è la mia sensibilità.

Credo sia meglio utilizzare questo, e in ogni caso credo che l'utilizzo di symfony/laravel o qualsiasi altro framework sia altamente consigliato per rendere di facile gestione il progetto anche a terzi collaboratori.

Poi scusa, perchè sposti le logiche sui cliente?
 
Poi scusa, perchè sposti le logiche sui cliente?
ci sono varie discussioni attive sul forum, in questo momento e originate dalla stessa persona,
tra le altre cose ho letto di transazioni bancarie …
mi sembra giusto valutare la sicurezza in tutti i suoi aspetti come hai accennato nel tuo post
d'altra parte è difficile che venga sottratto un server, è molto più alla portata di mano un client
penso quindi che W_T debba valutare anche la componente sicurezza del client, non solo della login ….
 
aggiungo un altro argomento,
e se rubano un computer (client) ????? …..

Volevo offuscare tutti i file PHP.
Inizialmente il progetto era di fare girare pagine remote nei client tramite il browser, poi non ho trovato il sistema di effettuare chiamate a file Python che risiedono nella home dei PC Client, file che contengono script per comunicare con le periferiche installate nei Client.
Quello sarebbe stato il progetto perfetto per questo lavoro, ma come fai da una pagina HTML a interagire con file Python o volendo file PHP su localhost ???

C'è una soluzione ma è troppo macchinosa, potendo intercettare via IP il Client potrei fare una chiamata HTTP_Request in JavaScript al server e dirgli di contattare il Client ed eseguire un interrogazione al file PHP che gira nel client stesso..., ti immagini che bordello!!!
 
Alle socket hai pensato?
Volendo potresti rimanere in ascolto su un socket per le varie operazione: quindi
  1. operi normalmente con python sul client (resto dell'idea che sarebbe meglio java o c++)
  2. Metti php in ascolto su un socket
  3. Esegui il codice corretto
  4. Effettui le operazioni
Ripeto forse sarebbe meglio vedere bene cosa e come l'applicazione debba lavorare, solo dopo aggiustare il tiro con la tecnologia.

Secondo me non necessiti di script lato client, al massimo solo exe/jar/py da eseguire sul client e basta, non serve avere 500 LAMPP installate, l'ambiente dovrebbe essere minimale... Nel caso in cui sbagliassi un codice cosa fai? Vai in tutte le postazioni per cambiarlo o hai previsto un git e quindi l'ugrade viene gestito in automatico?
Queste cose non sono banali.... Cmq...
Utilizza le socket che risparmi tempo, sposta la logica sul server, e direttamente con python chiami il server... Non complicare le cose, sono più semplici di quello che pensi.
Ti lascio questa citazione.....
1. Esci dalla confusione, trova la semplicità.
2. Dalla discordia, trova armonia.
3. Nel pieno delle difficoltà risiede l’opportunità.
cit. A.E.
 
In questi casi se rubassero una macchina Client, prima di ogni cosa sarebbe la macchina server a identificare/individuare il problema, quindi parliamo di una cosa inutile e soprattutto una buona progettazione sicuramente ha valutato mettendo in campo altre figure oltre al programmatore.

La macchina è dotata di Giroscopio + GPS + se l'IP pubblico dell'ADSL per quella determinata macchina cambia dopo l'installazione, il server non accetterà più chiamate da quella macchina stessa.

Credo sia meglio utilizzare questo

Autenticazione Digest, si fa con php + curl, come ho detto sopra, quella voglio fare.

Poi scusa, perchè sposti le logiche sui cliente?

Per logica che intendi, nel Client ho molte cose.
Nel Client ho lasciato tutto quello che comunica con il Sistema Operativo, con php + exec() devo chiamare dei script in Python o in C che gestiscono le periferiche.
 
Alle socket hai pensato?
Volendo potresti rimanere in ascolto su un socket per le varie operazione: quindi
  1. operi normalmente con python sul client (resto dell'idea che sarebbe meglio java o c++)
  2. Metti php in ascolto su un socket
  3. Esegui il codice corretto
  4. Effettui le operazioni
Ripeto forse sarebbe meglio vedere bene cosa e come l'applicazione debba lavorare, solo dopo aggiustare il tiro con la tecnologia.

Secondo me non necessiti di script lato client, al massimo solo exe/jar/py da eseguire sul client e basta, non serve avere 500 LAMPP installate, l'ambiente dovrebbe essere minimale... Nel caso in cui sbagliassi un codice cosa fai? Vai in tutte le postazioni per cambiarlo o hai previsto un git e quindi l'ugrade viene gestito in automatico?
Queste cose non sono banali.... Cmq...
Utilizza le socket che risparmi tempo, sposta la logica sul server, e direttamente con python chiami il server... Non complicare le cose, sono più semplici di quello che pensi.
Ti lascio questa citazione.....
1. Esci dalla confusione, trova la semplicità.
2. Dalla discordia, trova armonia.
3. Nel pieno delle difficoltà risiede l’opportunità.
cit. A.E.

Mi piace il tuo ragionamento, ti spiego:

Nel Client c'è un display touch dove l'utente effettua qualche operazione, mi serve un interfaccia utente dove ci sono dei campi di testo dei pulsanti e devo visualizzare un po di dati di risultati vari.

Le operazioni dei clienti vanno a chiamare questi file Python che risiedono nel sistema, i quali gestiscono le comunicazioni con le periferiche varie.
Per ogni operazione che il cliente fa e per ogni operazione che le periferiche fanno, deve essere comunicato tutto al server, ma non alla fine della sessione, bensì immediatamente dopo che è stata fatta, una per una, questo per un motivo di sicurezza in caso di situazioni avverse...

Premetto che conosco i seguenti linguaggi: PHP, Python, C#, JavaScript - "non conosco C, C++, Java".

Hai dei consigli per potermi indirizzare nella retta strada?
 
Scusate, dato la varie proposte e consigli che ho raccolto, sono arrivato a un pensiero drastico, ma credo sia quello più consono alle mie conoscenze e quindi alla messa in sicurezza del progetto.

Credo sia giusto sostituire il PC dei Client e il SO di conseguenza, adotterò un PC dove posso fare girare Windows in modo da fare la programmazione in C#.

1) Conosco il linguaggio
2) Sposto tutta la logica nel Server
3) ho un interfaccia grafica che comunica direttamente con le periferiche.

4) Devo decidere il metodo di comunicazione tra Client e Server
 

Discussioni simili