Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Java] Controleren of socket is verbonden met localhost

Pagina: 1
Acties:

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Ik ben een Java applicatie aan het schrijven met een web interface, die via een socket met een PHP script wordt aangestuurd. Dat gaat goed, maar ik wil nu zorgen dat alleen het PHP script toegang heeft tot bepaalde commando's. Zodat niet iedereen "STOP" naar mijn app kan sturen zeg maar.

Natuurlijk ga ik een soort handshake met wachtwoord implementeren, maar het leek me ook makkelijk om gewoon te controleren of de client aan de andere kant van de socket de localhost is. Mijn idee:
Java:
1
private boolean isLocalHost = socket.getInetAddress().isAnyLocalAddress();


Die geeft false. Debuggen:

Java:
1
2
3
4
5
6
7
8
    this.address = socket.getInetAddress();
    try {
        System.out.println("Localhost address: " + InetAddress.getLocalHost().getHostAddress());
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    System.out.println ("Connection established with: " + this.address.getHostAddress());
}


Output:
Localhost address: 192.168.1.100
Connection established with: 127.0.0.1

De PHP verbinding komt dus logischerwijs van 127.0.0.1, maar de getLocalHost functie geeft mijn IP-adres op mijn thuisnetwerk terug (ik test offline met XAMPP). Ik had verwacht dat die 127.0.0.1 zou geven.

Je vraagt je misschien af, waarom zo moeilijk doen? Check gewoon of het adres van de client 127.0.0.1 is!
Java:
1
System.out.println(this.address.getHostAddress() == "127.0.0.1");

Output: false. Werkt dus niet 8)7 En dat terwijl getHostAddress precies die String teruggeeft.

Hoe krijg ik dit eenvoudige klusje wel voor elkaar?

TabCinema : NiftySplit


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:52
Je weet dat er verschil is tussen de operator == (die test of operands naar hetzelfde object verwijzen) en de equals() methode (die test of twee objecten dezelfde waarde representeren)? Zo niet, lees dit eens door: You Are What You Is: Defining Object Identity (of één van de andere 'tig artikelen die je hierover kunt Googlen). Dat verklaart waarschijnlijk waarom de laatste code niet werkt.

Als je overigens de documentatie van InetAddress bekijkt, dan zie je dat isAnyLocalAddress niet de methode is die je zoekt. Wellicht is isLoopbackAddress dat wel.

[ Voor 15% gewijzigd door Soultaker op 14-10-2008 15:03 ]


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Strings vergelijk je met de .equals methode.

Going for adventure, lots of sun and a convertible! | GMT-8


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Let er trouwens op dat elk 127.x.y.z adres een valid localhost adres is. Overigens snap ik niet waarom isAnyLocalAddress() false returnt bij een dergelijk adres. Het is toch duidelijk een lokaal adres :)

[ Voor 163% gewijzigd door .oisyn op 14-10-2008 15:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Soultaker schreef op dinsdag 14 oktober 2008 @ 14:59:
Je weet dat er verschil is tussen de operator == (die test of operands naar hetzelfde object verwijzen) en de equals() methode (die test of twee objecten dezelfde waarde representeren)? Zo niet, lees dit eens door: You Are What You Is: Defining Object Identity (of één van de andere 'tig artikelen die je hierover kunt Googlen). Dat verklaart waarschijnlijk waarom de laatste code niet werkt.

Als je overigens de documentatie van InetAddress bekijkt, dan zie je dat isAnyLocalAddress niet de methode is die je zoekt. Wellicht is isLoopbackAddress dat wel.
Dank u zeer _/-\o_

De oorzaak van mijn verwarring én een betere oplossing. Dat van dat equals wist ik niet, ik gebruik Java pas een dag O-)

TabCinema : NiftySplit


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, er is ook gewoon een isLoopbackAddres(), die kun je ook gewoon gebruiken. Lijkt me een stuk handiger dan een arbitraire string compare. De docs van isAnyLocalAddress zegt trouwens:
isAnyLocalAddress
Utility routine to check if the InetAddress is a wildcard address.
Dat is dus 0.0.0.0, die je kunt gebruiken bij een bind() om te binden aan elk valide adres. Aangezien de source van een binnenkomende connectie nooit 0.0.0.0 is is het logisch dat het false is.

Wel vaag trouwens dat er geen manier is om alle lokale adressen op te vragen...

.edit: ah Soultaker had dat er al bijgeëdit :)

[ Voor 4% gewijzigd door .oisyn op 14-10-2008 15:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 14-11 18:25
De regel
code:
1
InetAddress.getLocalHost();

geeft een lokale adres terug.
Dit is dus niet de IP van de aanvrager, maar van de machine die de betreffende code uitvoert.
Deze pakt volgens mij gewoon een lokaal ip adres, welke als eerste gebruikt moet worden. Afhankelijk van je netwerk configuratie is dit dus het 192.* adres.
Als je dan uiteindelijk verbinding maakt (alleen lokaal) gebruikt hij de local loopback en zal die dus op 127.0.0.1 uitkomen. Dat is dus de uitkomst bij
code:
1
this.address.getHostAddress();

Dit is dus het IP adres van de aanvrager (klant). Bij lokaal testen is het dus 127.0.0.1.

Als je op die IP wilt controleren moet je dat met de .equals( ) methode doen. (constante veelal links, dus)
code:
1
 "127.0.0.1".equals( this.address.getHostAddress() );


Misschien kun je ook de volgende functies gebruiken:
- isLinkLocalAddress()
- isLoopbackAddress()

let the past be the past.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is idd de samenvatting van deze topic, bedankt ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Hihi. Hartelijk dank allemaal voor de inzet!

TabCinema : NiftySplit


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 11-11 15:07
Nog beter is om bij de constructor van ServerSocket bij bindAddr 127.0.0.1 op te geven. Dan kan alleen maar vanaf lokaal verbinding gemaakt worden, en hoef je dus niet binnenkomende verbindingen te checken.

[ Voor 40% gewijzigd door matthijsln op 14-10-2008 17:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hij zei:
Dat gaat goed, maar ik wil nu zorgen dat alleen het PHP script toegang heeft tot bepaalde commando's
Hieruit maak ik op dat niet alleen het PHP script mag connecten, alleen mag dat script wel meer dan andere connecties van buitenaf. Als je bind op localhost dan kunnen connecties van buitenaf natuurlijk niet meer.

[ Voor 13% gewijzigd door .oisyn op 14-10-2008 17:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • GrooV
  • Registratie: September 2004
  • Laatst online: 12-11 19:19
Als je via localhost connect naar je netwerk IP dan gaat dit niet over 127.0.0.1 maar over het netwerk IP dus zal je een of andere manier van authenticatie moeten bedenken. Of een check die kijkt of het te connecten ip op de pc van je server draait

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Dat binden is wel een goed idee. Dan maak ik gewoon een aparte socket (poort) voor admin functies, die alleen toegankelijk is vanaf de server.

TabCinema : NiftySplit


Verwijderd

Misschien is het een idee om een pipe of unix domain sockets gebruiken?

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Werkt dat in Java, PHP en Flash op Unix en Windows?

TabCinema : NiftySplit

Pagina: 1