Search Members Help

» Willkommen Gast
[ Einloggen :: Registrieren ]

Alle Beiträge auf einer Seite

[ bei Antworten benachrichtigen :: per E-Mail senden :: Thema ausdrucken ]

reply to topic new topic new poll
Thema: Secure Login und Kommunikation, für die Coder< Älteres Thema | Neueres Thema >
 Beitrag Nummer: 1
Luke_Filewalker Search for posts by this member.
Bastard Operator From Hell
Avatar

TeamIcon

Gruppe: Administrators
Beiträge: 891
Seit: 23.12.2005
PostIcon Geschrieben: 20.11.2011, 16:52  Skip to the next post in this topic. Ignore posts   QUOTE

@BR103
Ich veröffentliche grundsätzlich keine (kompletten) Sourcecodes. Das hängt damit zusammen, das in meinen Freeware Tools auch Teile aus kommerzieller Software meiner Firma Verwendung finden. Ich bitte um Verständnis. ;)  Lediglich kleinere Codeschnippsel die so in keiner unserer kommerziellen Software vorkommen gehen okay. Die dürften auch reichen wenn Du eh selbst programmieren kannst. In welche Sprache programmierst Du eigentlich? Meine primären Sprachen sind VB6, AI3, Perl und noch ein paar kleinere Scriptsprachen.

Aber ich kann Dir natürlich bei der Sache mit dem Secure Login helfen. Und was die Kommunikation angeht, so ist die im Falle von CGI herrlich simpel. Unter anderem darum habe ich mich für CGI und nicht für Telnet entschieden. Alle Kommunikation läuft über simple HTTP Requests per API. Zu Android kann ich Dir gar nichts sagen bzw. helfen da das absolut nicht meine Welt ist. Du musst selbst nachschauen wie Du da Webseiten abrufen kannst.

Was den Secure Login angeht, so ist auch das absolut simpel wenn man erstmal weiss wie. Wie bei allem halt. Übrigens steht das alles auch im Handbuch vom NETIO. Allerdings muss ich dazu sagen, das ist dort lausig beschrieben. Erst durch probieren hab ich rausgefunden wie es geht und ab da hab ich dann auch das Handbuch verstanden. :D Das Problem hatten übrigens einige, die wie ich das Handbuch nicht verstanden hatten.

Ich poste hier mal das relevante Modul:

CODE
Private Sub DoLogin(ByVal user As String, ByVal pass As String)
Dim login_pass As String, passraw As String

NETIOcmd "hash=hash"
If rc_hash(netio_rc$) Then
 netio_hash$ = netio_rc$
 passraw$ = DeCrypt(pass$, "{gelöscht}")
 pass$ = LCase(myMD5.DigestStrToHexStr(user$ & passraw$ & netio_hash$))
 passraw$ = String(Len(passraw$), Chr(0))
 NETIOcmd "login=c:" & user$ & ":" & pass$
 pass$ = String(Len(pass$), Chr(0))
Else
 NETIOcmdLog "Login", netio_rc$, "ERROR: invalid hash!", "Login"
End If

End Sub


Zuerstmal habe ich mir eine Funktion namens NETIOcmd geschrieben die sich um die Kommunikation mit dem NETIO kümmert, so das ich nur das Notwendigste übergeben muss. In NETIOcmd findet dann der eigentliche HTTP Request statt. Und wie das bei Android geht, musst selbst rausfinden.

Im Prinzip ist der Request simpel und Du kannst alles hier direkt in einem Browser testen. Für den Secure Login werden 2 Requests benötigt. In den Beispielen sieht man übrigens das der Port nicht zwingend angegeben werden muss, zumindest nicht wenn dieser dem Standard 80 entspricht.

Request 1, Login-Hash anfordern:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?hash=hash


Dann liefert der NETIO den temporären und zufälligen Login-Hash der wichtig für den Secure Login ist. Sagen wir der Hash wäre DA29E001. Jetzt kommt der interessante Teil. Wie Du im Login Modul sehen kannst, muss Benutzername (z.B. user), Passwort (z.B. geheim) und Login-Hash zu einem String verbunden werden und dann darauf der MD5 Hash gebildet werden.

Beispiel:

Benutzer=user
Passwort=geheim
Login-Hash=DA29E001

Das wäre dann also:

usergeheimDA29E001

und der MD5 Hash dafür wäre:

EEFE1959E9915129C23FD283A04A91C0

Request 2, Login durchführen:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?login=c:user:EEFE1959E9915129C23FD283A04A91C0


Das wars. Jetzt lässt sich der NETIO steuern über den Port Befehl.

Beispiel:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?port=ui10


0 = off (aus)
1 = on (ein)
i = interrupt (unterbrechen)
u = unchanged (unverändert)

Also bleibt hier der Ausgang 1 unverändert, Ausgang 2 wird unterbrochen, Ausgang 3 wird eingeschaltet und Ausgang 4 wird ausgeschaltet.

Zum Abschluss dann noch ein sauberes Logout damit uns der NETIO nicht irgendwann temporär sperrt:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?quit=quit


Bearbeitet von Luke_Filewalker am 23.11.2011, 15:44

--------------
Luke 'GTH' Filewalker
...may the backup be with you - always!
Zitat: "Nicht gesicherte Dateien dürfen als gelöscht betrachtet werden"
Offline
Top of Page Profile Contact Info WEB 
 Beitrag Nummer: 2
BR103 Search for posts by this member.

Avatar



Gruppe: Members
Beiträge: 10
Seit: 17.11.2011
PostIcon Geschrieben: 21.11.2011, 00:13 Skip to the previous post in this topic. Skip to the next post in this topic. Ignore posts   QUOTE

Danke - Das ist schon ausreichend, ich habe die Syntax auch nicht aus der Anleitung entnommen.
Mal sehen, ob ich in den nächsten Wochen ein bißchen Zeit finde - habe heute Abend mal die ganze Entwicklungsumgebung für Android installiert.
Offline
Top of Page Profile Contact Info 
 Beitrag Nummer: 3
Luke_Filewalker Search for posts by this member.
Bastard Operator From Hell
Avatar

TeamIcon

Gruppe: Administrators
Beiträge: 891
Seit: 23.12.2005
PostIcon Geschrieben: 21.11.2011, 10:14 Skip to the previous post in this topic. Skip to the next post in this topic. Ignore posts   QUOTE

Hab das Beispiel noch ein bisschen überarbeitet und beim Port Befehl noch Interrupt dazugenommen. Denn ich könnte mir vorstellen, dass hier durchaus noch der eine oder andere Coder eintrudelt und das Beispiel brauchen kann.

Weitere Infos:
In NETIOcmd mache ich den HTTP Request. Die Funktion nimmt sich dazu IP und Port aus der INI damit ich das nicht ständig übergeben muss und setzt das dann zusammen:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?{befehl}


An NETIOcmd übergebe ich also nur den reinen Befehl für den NETIO der nach /tgi/control.tgi? angehängt wird. NETIOcmdLog kannst in meinem DoLogin Code komplett ignorieren. Diese Funktion kümmert sich lediglich um das aktualisieren der Meldungen und der Protokolldatei. Da machst Du ja dann eh was eigenes, falls Du das überhaupt protokollieren willst.

Noch was wichtiges:
Deine Funktion die den HTTP Request ausführt, sollte nicht einfach <html> und </html> aus der Rückgabe rausfiltern, sondern unbedingt alles zwischen diesen beiden Tags extrahieren. Denn es kann vorkommen, das vor dem <html> Tag noch Schrott vom NETIO (oder von was auch immer) geliefert wird.

Wenn Du z.B. den Status abfrägst, sollte vom NETIO normalerweise nur das hier zurückgeliefert werden:

CODE
<html>0 0 0 0 </html>


Status wird so abgefragt:

CODE
http://{netio ip}[:{netio port}]/tgi/control.tgi?port=list


Es kann aber auch mal Schrott drin stehen, das sieht dann z.B. so aus:

CODE
HTTP/1.0 200 OK
Connection: close
Set-Cookie: Netio230A=; path=/

<html>0 0 0 0 </html>


Deswegen immer den Inhalt von <html></html> extrahieren, nicht einfach diese Tags rausfiltern!

Es hat ne Weile gedauert bis ich das gemerkt hatte, weil es nur selten vorkommt. Darum erwähne ich das auch gleich, weil das ne echte Stolperfalle sein kann. Wobei ich mir jetzt nicht mehr sicher bin, ob das nur beim A Typ vorkommt und beim B Typ nicht. Aber ist im Prinzip egal, wenn Du ne Steuerung für NETIO schreiben willst, musst eh alle Eventualitäten für alle NETIOs mit einkalkulieren.


Bearbeitet von Luke_Filewalker am 23.11.2011, 15:47

--------------
Luke 'GTH' Filewalker
...may the backup be with you - always!
Zitat: "Nicht gesicherte Dateien dürfen als gelöscht betrachtet werden"
Offline
Top of Page Profile Contact Info WEB 
 Beitrag Nummer: 4
Luke_Filewalker Search for posts by this member.
Bastard Operator From Hell
Avatar

TeamIcon

Gruppe: Administrators
Beiträge: 891
Seit: 23.12.2005
PostIcon Geschrieben: 21.11.2011, 12:39 Skip to the previous post in this topic.  Ignore posts   QUOTE

Grad mal im LFNC Log gestöbert und noch mehr Schrott gefunden.

Sowas kann auch vorkommen:

CODE
HTTP/1.0 200 OK
Connection: close
Content-Length: 70
Set-Cookie: Netio230A=; path=/

<html>110 BYE</html>._V_`ê


Die Unterstriche waren nicht darstellbare Sonderzeichen die ich eben durch Unterstriche ersetzt habe. Rechne also mal lieber mit allem möglichen.  :rolleyes: Es kann also nicht nur vor dem HTML Tag sondern auch noch danach Schrott stehen. Aber laut Log kommt das selten vor.

Übrigens eignet sich LFNC auch prima um zu lernen wie die Kommunikation läuft. Du kannst in den Meldungen einen Doppelklick auf den jeweiligen Eintrag machen und dann zeigt LFNC in einem extra Fenster was genau zum jeweiligen Zeitpunkt an den NETIO geschickt wurde und was daraufhin zurückkam. Wenn Du dann noch in den Optionen das Logfile mit erweiterten Infos aktivierst, kannst jederzeit nochmal in Ruhe nachlesen was gelaufen ist, bis auf die Millisekunde genau.


Bearbeitet von Luke_Filewalker am 21.11.2011, 12:41

--------------
Luke 'GTH' Filewalker
...may the backup be with you - always!
Zitat: "Nicht gesicherte Dateien dürfen als gelöscht betrachtet werden"
Offline
Top of Page Profile Contact Info WEB 
3 Antworten seit 20.11.2011, 16:52 < Älteres Thema | Neueres Thema >

[ bei Antworten benachrichtigen :: per E-Mail senden :: Thema ausdrucken ]


Alle Beiträge auf einer Seite
reply to topic new topic new poll