[PHP] verberg input telnet server

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goedemiddag.

De topictitel is misschien niet zo heel duidelijk maar ik wist niet hoe ik het beter kon verwoorden. Ik ben bezig met een simpel chat programma in PHP dat werkt via sockets. Je logt in mbv een telnet client. Nu ben ik bezig met het inlog systeem, dat gaat allemaal prima, alleen loop ik tegen 1 probleem op: hoe verberg ik het intypen van het wachtwoord bij het inloggen. Dus dat men in de telnet client wel het wachtwoord typt, maar het verschijnt niet op het scherm.

Vroeger heb ik wel eens MUD's gespeeld en daar had je ook altijd zo'n inlogsysteem waarbij je het wachtwoord niet op het scherm ziet verschijnen, maar het wordt wel naar de server gestuurd. Het kan dus wel, wie weet hoe?

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Had je de RFC nog niet gevonden?
NAME CODE MEANING
Hide your input 133 The intention is that a server will send this signal to a user system which is echoing locally (to the user) when the user is about to type something secret (e.g. a password). In this case, the user system is to suppress local echoing or overprint the input (or something) until the server sends a NOECHO signal. In situations where the user system is not echoing locally, this signal must not be sent by the server.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

vergeet niet dat het password in clear-text wordt verstuurd en dus erg makkelijk is te onderscheppen. hellaas kun je hier niks aan doen omdat telnet daar geen enkele support voorbied.

mischien kun je ook eens kijken naar ncurses. het bestaat niet voor windows maar voor een linux server kun je daar een aardige interface mee bouwen. of je bouwt gewoon je eigen text-buffer zoals ik.

wat ik een groot gemis vindt van de zowel de telnet client als de command-line is dat niet elke toetsaanslag direct wordt doorgestuurd maar eerst nog weer een enter nodig is. maarja daar kun je ook niks aan doen. dan maar zelf een client schrijfen, doe er meteen nog een dosis gtk bij.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ehm.. juist.. dit is voornamelijk abra kadabra voor mij, ik heb redelijke kennis van PHP maar ncurses? gtk? RFC? Het zegt me allemaal niks. :P

Ik heb de PHP manual over sockets al doorgespit maar er is geen enkele functie die doet wat ik nodig heb. Is het soms misschien nog niet mogelijk in de huidige php socket-implementatie?

Acties:
  • 0 Henk 'm!

  • Mosselmaniac
  • Registratie: Juli 2004
  • Laatst online: 20-09 15:08
Verwijderd schreef op maandag 26 februari 2007 @ 15:27:
Ehm.. juist.. dit is voornamelijk abra kadabra voor mij, ik heb redelijke kennis van PHP maar ncurses? gtk? RFC? Het zegt me allemaal niks. :P

Ik heb de PHP manual over sockets al doorgespit maar er is geen enkele functie die doet wat ik nodig heb. Is het soms misschien nog niet mogelijk in de huidige php socket-implementatie?
RFC == Request for Comment, of voor waar ik werk een Request for Change ;)

Maar goed, in dat document (318) staat beschreven hoe je protocol werkt. Ik stel voor dat je dat eerst even doorleest :)

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Er staat zelfs een alternatieve manier beschreven in de RFC mocht je de control signals niet voor elkaar krijgen; namelijk het gebruik van masks. En helaas wordt er inderdaad van je verwacht dat je het zelf schrijft; ik ga de uitleg iig niet voorkauwen; daar leer je namelijk helemaal niets van :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 26 februari 2007 @ 15:27:
Ehm.. juist.. dit is voornamelijk abra kadabra voor mij, ik heb redelijke kennis van PHP maar ncurses? gtk? RFC? Het zegt me allemaal niks. :P

Ik heb de PHP manual over sockets al doorgespit maar er is geen enkele functie die doet wat ik nodig heb. Is het soms misschien nog niet mogelijk in de huidige php socket-implementatie?
RFC = een werkgroep die de internet standaarden beheert zoals de specificaties van tcp, ip maar ook http of ftp en telnet hebben ze bedacht.

GTK = gimp toolkit. dit is een framework wat vooral onder linux wordt gebruikt om vensters en knoppen op het scherm te toveren. een stel functies om een grafische gebruikers interface mee te maken. en is ook voor windows beschikbaar en dus crossplatform.

Ncurses = een framework om een grafische interface mee te maken die is opgebouwed uit text in plaats van pixels. erg handig dus in terminals zoals telnet of de command prompt. als je in de php-manual nou even naar de n scrolt zie je daar een hoofdstuk over Ncurses.

links:
http://gtk.php.net/ (gtk voor php)
http://nl3.php.net/manual/en/ref.ncurses.php

verder verbaasd het me dat je eigenlijk met het meeste ingewikkelde en complexe hoofdstuk van php begint, sockets, terwijl je nog nooit van de RFC had gehoord. dit is echt wel voor gevordenden hoor.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke.. allereerst wil ik even zeggen dat ik absoluut niet ondankbaar of lui wil overkomen, ik apprecieer het echt heel erg dat jullie dingen voor mij opzoeken en uitvogelen. Maar tot nu toe kan ik er nog niet zoveel mee.

Ik heb gekeken naar dat ncurses, maar voor zover ik kan zien gaat dat alleen op als je een php script via de commandline draait. Nu draai ik de socket server natuurlijk wel commandline, alleen gaat het erom dat de clients die dus verbinden via telnet met die socket server, een ncurses-achtige interface hebben.

En Spider.007: ik heb het vluchtig doorgelezen maar ik snap er gewoon helemaal niks van. Die codes heb ik via socket_send met alle mogelijke opties verstuurd maar het werkt gewoon niet. Ik krijg gewoon de plain code als ik inlog op de server.

Tuurlijk, ik snap dat men niet alles wil voorkauwen. Maar alleen een link naar het telnet protocol vind ik ook een beetje extreem. Immers, bijna álles is gedocumenteerd maar door de bomen ziet men het bos niet meer. Zo ik ook. Het zal vast wel in die FAQ staat hoe en wat, maar het is zoveel nieuwe informatie dat ik totaal de kluts kwijtraak. En zoals Docey al zei, sockets in php is niet echt heel simpel te noemen.
Spider.007 schreef op maandag 26 februari 2007 @ 22:19:
Er staat zelfs een alternatieve manier beschreven in de RFC mocht je de control signals niet voor elkaar krijgen; namelijk het gebruik van masks. En helaas wordt er inderdaad van je verwacht dat je het zelf schrijft; ik ga de uitleg iig niet voorkauwen; daar leer je namelijk helemaal niets van :)
Ben ik het met je eens, maar af en toe een zetje in de goede richting kan geen kwaad toch?

Ik zal nog even mijn probleem wat gedetailleerder schetsen. Ik heb een SocketServer class die in een while loop mbv socket_recv info krijgt toegestuurd van verbonden clients (via telnet) en mv socket_write info stuurt naar die clients. Hoe kan ik er nou voor zorgen dat zo'n verbonden client info kan typen en sturen naar de server, zonder dat de input lokaal wordt geëcho'd (dus dat je als client niet ziet wat je typt).


PHP: socketserver.php
96
            $bytes = socket_recv($socket, $buffer, 2048, 0);

PHP: socketserver.php
31
        socket_write($this->sockets[$sock_id], $msg);

Acties:
  • 0 Henk 'm!

Verwijderd

standaard gebeurt dat ook niet volgensmij. je moet de input weer terug sturen naar de client maar dat ik ook fout hebben.

sockets zijn een lastig en best ingewikkeld systeem in elke programmer taal. de php socket extensie is eigenlijk slechts een wrapper voor de BSD sockets zoals je die in C of C++ zou gebruiken. ze werken daarom ook bijna identiek en veel C++ tutorials zijn probleemloos te gebruiken met php sockets.

wat ik je zou aanraden is om je socket implementatie in een class te schrijven en daar een 'cycle' methode bij te stoppen die je dan telkens aanroept van buiten de class. de 'cycle' methode zou dan moeten beginnen met een socket_listen om te kijken of er activiteit is. dan een socket_accept om de nieuwe connecties welcom te heten. de resource bewaar je dan ook in de class.

en dan als er activiteit was gemeten met socket_listen, een socket_recv op alle sockets te doen en de gelezen data in een buffer te stoppen. daarna laat je je 'cycle' functie true returnen als er niks aan de hand was. false als er iets fout ging en een getal of bijvoorbeeld een array met connectie-ids als er informatie is binnengekomen waar iets mee kan worden gedaan.

vervolgens zou je dan een ander class te kunnen maken die dan wat doet met de informatie die nu als string in een soort buffer is geladen in je socket class. deze kan dan bijvoorbeeld een soort interface zoals ncurses dat doet laten tekenen en die weer terug sturen middels een 'send' methode op de socket class welke 2 parameters aanvangt. 1 het id waarmee de connectie wordt onderscheiden en 2 de te versturen data. de class zoekt dan zelf de bijbehorende resource op en verstuurt de data.

ik denk dat dit de beste approach is voor wat jij wil of je moet je echt diep gaan verdiepen in 'terminal controll signals' welke ook weer verschillen tussen de verschillende telnet clients.

soms wil php moeilijk doen om een bepaalde byte in een string te stoppen. je kun dan gebruik maken van de chr() functie voor 8-bits codes en pack("n") voor 16bit of pack("N") voor 32bits.

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op dinsdag 27 februari 2007 @ 20:34:
[...]

En Spider.007: ik heb het vluchtig doorgelezen maar ik snap er gewoon helemaal niks van. Die codes heb ik via socket_send met alle mogelijke opties verstuurd maar het werkt gewoon niet. Ik krijg gewoon de plain code als ik inlog op de server.

[...]
Heb je geprobeerd om socket_write($s, chr(133)) te doen?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Verwijderd schreef op maandag 26 februari 2007 @ 14:01:
vergeet niet dat het password in clear-text wordt verstuurd en dus erg makkelijk is te onderscheppen. hellaas kun je hier niks aan doen omdat telnet daar geen enkele support voorbied.

mischien kun je ook eens kijken naar ncurses. het bestaat niet voor windows maar voor een linux server kun je daar een aardige interface mee bouwen. of je bouwt gewoon je eigen text-buffer zoals ik.

wat ik een groot gemis vindt van de zowel de telnet client als de command-line is dat niet elke toetsaanslag direct wordt doorgestuurd maar eerst nog weer een enter nodig is. maarja daar kun je ook niks aan doen. dan maar zelf een client schrijfen, doe er meteen nog een dosis gtk bij.
En wat heeft de topic starter hieraan? Helemaal niks toch :?

Volgens mij wil hij juist telnet gebruiken omdat iedereen die windows heeft ook standaard een telnet-client heeft en je dus niets hoeft te installeren om te kunnen chatten...

Als iemand wil leren lopen geef je hem toch ook geen fiets 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

rrrandy schreef op woensdag 28 februari 2007 @ 10:19:
[...]


En wat heeft de topic starter hieraan? Helemaal niks toch :?

Volgens mij wil hij juist telnet gebruiken omdat iedereen die windows heeft ook standaard een telnet-client heeft en je dus niets hoeft te installeren om te kunnen chatten...

Als iemand wil leren lopen geef je hem toch ook geen fiets 8)7
ik heb zelf nooit met ncurses gewerkt maar mischien is het mogelijk de output van ncurses op te vangen die door te sturen. je moet dan wel je server onder linux draaien maar dat is volgensmij geen probleem. maar aangezien ik dat zelf nooit heb geprobeerd was het maar een ideetje.

Als iemand wil leren lopen geef je hem toch een camera zodat die kan opnemen hoe anderen lopen en dan zelf gewoon nadoen wat anderen op die video-band doen. rote-learning noemen ze dat.

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op woensdag 28 februari 2007 @ 23:34:
[...]


ik heb zelf nooit met ncurses gewerkt maar mischien is het mogelijk de output van ncurses op te vangen die door te sturen. je moet dan wel je server onder linux draaien maar dat is volgensmij geen probleem. maar aangezien ik dat zelf nooit heb geprobeerd was het maar een ideetje.

[...]
ncurses is een library om GUI's te maken. Hoe zou dit een telnet-server gerelateerd probleem moeten oplossen?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Spider.007 schreef op donderdag 01 maart 2007 @ 09:39:
[...]

ncurses is een library om GUI's te maken. Hoe zou dit een telnet-server gerelateerd probleem moeten oplossen?
ncurses is geen libary om Graphical User Interface of GUI mee te maken maar om Text of Terminal based User Interface mee te maken. aangezien Telnet niks meer is dan een manier om een Terminal over een netwerk te laten werken zou het mogelijke moeten zijn om de Terminal die ncurses geeft door te geven via het netwerk aan de Telnet client.

je zou dan een soort proxie of passtrough server moeten schrijven die bijvoorbeeld via een bi-directionele pipe een 2e php-cli opstart wat een ncurses terminal uitspugt. dit stuur je dan door en de reply van de telnet client stuur je weer naar de 2e php-cli via de bi-directionele pipe verbinding.

php-script met ncurses <--pipe---> php-script met sockets <---netwerk--> windows telnet client.

puur theorie aangezien ik niet de tijd heb om dit uit te proberen maar de TS zou het eens kunnen proberen. daarnaast zou deze methode nog multi-treaded zijn ook, nouja forked zoals apache doet.

[ Voor 3% gewijzigd door Verwijderd op 02-03-2007 15:07 ]


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Spider.007 schreef op woensdag 28 februari 2007 @ 09:48:
Heb je geprobeerd om socket_write($s, chr(133)) te doen?
Volgens mij moet je met deze tip er wel komen. De RFC's TELNET CONTROL SIGNALS
vertelt eveneens hoe je weer kan vertellen aan de client dat ie opnieuw mag echo'en.

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op vrijdag 02 maart 2007 @ 15:05:
[...]

je zou dan een soort proxie of passtrough server moeten schrijven die bijvoorbeeld via een bi-directionele pipe een 2e php-cli opstart wat een ncurses terminal uitspugt. dit stuur je dan door en de reply van de telnet client stuur je weer naar de 2e php-cli via de bi-directionele pipe verbinding.

php-script met ncurses <--pipe---> php-script met sockets <---netwerk--> windows telnet client.

[...]
Je wilt dus een UI maken die communiceert met een andere applicatie waarmee de [telnet] client alsnog met hetzelfde probleem zit? :? Ik snap vrij weinig van het idee wat je hier probeert te illustreren

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, ik ben er (min of meer) uit. Veel gestoei met verschillende waarden heeft uiteindelijk het volgende opgeleverd:

PHP:
1
socket_write($socket, chr(255).chr(251).chr(1));

Deze code zorgt ervoor dat de input niet lokaal geëcho'd wordt.

Je moet dus zoals Spider.007 al aangaf inderdaad chr() gebruiken maar het probleem lag eraan dat de client geen IAC command ontving. De IAC geeft aan dat er een telnet command komt.

Dit zijn de codes die ik gebruik:
code:
1
2
3
255 IAC  Interpret as command
251 WILL Indicates the desire to begin performing, or confirmation that you are now performing, the indicated option.
1   ECHO echo


Het enige wat ik nog niet snap, is het volgende; feitelijk stuur ik nu het command "IAC WILL ECHO", oftewel:
The sender of this command REQUESTS to begin, or confirms that it
will now begin, echoing data characters it receives over the
TELNET connection back to the sender of the data characters.
Maar dit komt toch totaal niet overeen met het resultaat? Dat de input verborgen wordt? Ik zou een "IAC DON'T ECHO" veel logischer vinden:
The sender of this command DEMANDS the receiver of this command
stop, or not start, echoing data characters it receives over the
TELNET connection.
Overigens:
NAME CODE MEANING
Hide your input 133 The intention is that a server will send
this signal to a user system which is
echoing locally (to the user) when the user
is about to type something secret (e.g. a
password). In this case, the user system
is to suppress local echoing or overprint
the input (or something) until the server
sends a NOECHO signal. In situations where
the user system is not echoing locally,
this signal must not be sent by the server.
Dit werkt helemaal niet:
PHP:
1
socket_write($socket, chr(255).chr(253).chr(133));

Mijn telnet client stuurt dit terug:
code:
1
255 252 133

Oftewel "IAC WON'T Hide your input". Hij weigert dus gewoon om die command uit te voeren. :S
Ik snap er eerlijk gezegd nog steeds vrij weinig van. Het werkt wel, maar als iemand dit zou kunnen toelichten ben ik erg blij. :)

Hier staat ook nog het een en ander: http://www.scit.wlv.ac.uk/~jphb/comms/telnet.html

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

De reden dat 'IAC WILL ECHO' wel werkt; maar 'IAC DON'T ECHO is dat er vanuit wordt gegaan dat er altijd iemand iets moet echo-en. Als de server niet aangeeft dat hij dat doet; dan zal de client het zelf doen. Wat je nu dus doet is zeggen 'ik [server] ga het zelf echo-en'. De client zal hierop zijn eigen echo-ing uitschakelen; terwijl jij ook niet echo-ed; met als resultaat dat de input dus verborgen wordt. Dat 133 niet wordt geimplementeerd kan gerelateerd zijn aan dit stuk van de quote:
In situations where the user system is not echoing locally, this signal must not be sent by the server.
Oftewel; waarschijnlijk heb jij al "255 251 1" gestuurd voordat je "255 253 133" verstuurd?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah oke, dat verklaart een hoop. Nee, ik heb niet eerst een 251 verstuurd.. maar ik lees op de volgende site het volgende:
140 133 -- DO HIDE INPUT
140 132 -- DO ECHO REMOTE
141 132 -- WON'T ECHO REMOTE
141 133 -- WON'T HIDE INPUT
Dat zijn dus hele andere codes? Ik heb dit geprobeerd:
PHP:
1
socket_write($socket, chr(255).chr(140).chr(133));


Maar dit heeft geen effect. De client toont gewoon een vraagteken.

Het werkt dus wel inmiddels, maar vroeg me alleen af waarom de hide-your-input code niet gewoon werkt. :P

[ Voor 10% gewijzigd door Verwijderd op 03-03-2007 19:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Spider.007 schreef op vrijdag 02 maart 2007 @ 18:53:
[...]
Je wilt dus een UI maken die communiceert met een andere applicatie waarmee de [telnet] client alsnog met hetzelfde probleem zit? :? Ik snap vrij weinig van het idee wat je hier probeert te illustreren
mijn idee was dat ncurses de nodige telnet of eigenlijk terminal-control codes zou uitspugen waardoor je dat dus niet meer zelf hoeft te doen en je je meer zou kunnen gaan concentreren op de inhoud.

maar zoals ik ook al zei weet ik niet hoever de terminal-control codes die ncurses uitspuugt verschillen vandat wat een windows telnet-client begrijpt. het was maar een ideetje omdat ik vermoed dat ncurses hier al veel functionaliteit voor aanbord heeft aangezien het een heel framework is om terminals mee te bouwen, dus niet alleen om wachtwoorden te verbergen maar ook om bijvoorbeeld hele formulieren en menu's mee te bouwen etc.

ncurses is een framework om een terminal interface mee te maken. dus inclusief de control-signals etc. aangezien ncurses dit weer echo't naar bijvoorbeeld bash die het dan op het scherm tovert.

aangezien telnet gebaseerd is op een terminal standaard en ncurses een terminal output naar bash. vermoedt ik, want ik weet niet op welke terminal standaard telnet gebaseerd is, dat als je de output die ncurses naar de linux bash stuurt bijvoorbeeld, naar een windows telnet client zou sturen dat hier een bruikbare terminal verschijnt.

snap je het nou een beetje? ncurses spuugt een terminal uit. inclusief de controll codes zoals IAC of ECHO bijvoorbeeld. als dit blijkt te werken, dan zou dat de TS een heleboel werk schelen.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Niet om het een of ander hoor, maar wellicht is het handiger om naar deze pear library te kijken? Iets met wiel en opnieuw uitvinden :+

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1