2010-02-01 14 views
15

Sto cercando un modo per fare un traceroute lato client, cioè in un browser.È possibile eseguire un traceroute nel browser?

Per quanto ne so, non è possibile inviare pacchetti ICMP, UDP o TCP con valori TTL arbitrari tramite Javascript o Flash. So che Flash consente connessioni TCP tramite la classe Socket in Actionscript ma non sembra utile per un'implementazione traceroute.

È l'unica soluzione per sviluppare un plug-in del browser?

EDIT: Ho appena scoperto che è stato fatto con un applet Java: http://www.codefromthe70s.org/traceroute.aspx

La cattiva notizia è che questa applet richiede di essere firmato il codice, perché in realtà analizza l'uscita dal eseguibile ping di il sistema client sottostante. Per questo motivo, all'utente viene chiesto di consentire l'esecuzione dell'applicazione Java, che è ingombrante.

Maggiori informazioni qui: http://www.codefromthe70s.org/traceroute_explained.aspx

Sto ancora cercando una soluzione più semplice se qualcuno può aiutare.

MODIFICA 2: Grazie per le vostre risposte. Immagino che dovrò andare con Java allora.

Mi chiedo se NaCl (http://code.google.com/p/nativeclient/) supporterà una sorta di app traceroute.

+0

Perché non riesci a firmare l'applet? – shylent

+0

Posso firmarlo ovviamente. Basta controllare se ci sono altri modi per farlo. – Franck

risposta

1

Non è possibile eseguire questa operazione da un browser. Javascript può al massimo aprire una connessione al suo server di origine per le richieste AJAX, ma può farlo solo tramite HTTP. Flash può parlare con host arbitrari, ma solo se sono elencati in un file crossdomain.xml sul server di origine e ancora solo tramite TCP. Il supporto UDP in Flash è apparentemente in sospeso.

Traceroute e ping sono entrambi protocolli basati su ICMP e non possono essere creati/controllati da Flash o Javascript. Inoltre, entrambi richiedono l'accesso "raw" per creare pacchetti personalizzati, e questo non può essere fatto sul lato del browser.Questo è il motivo per cui "ping" è un programma "SUID" su sistemi Unix, poiché l'accesso a pacchetti grezzi richiede i privilegi di root.

Nella migliore delle ipotesi è possibile eseguire un'implementazione sul lato server e inviare l'output al browser. E anche allora, molto probabilmente non è possibile farlo da un processo in-server su una scatola Unix, poiché è improbabile che il server Web funzioni come root. Dovresti eseguire il ping del sistema e/o traceroute e reindirizzare l'output al browser.

+1

"Non puoi farlo affatto da un browser." - ad eccezione di un'applet firmata che utilizza JNI. Sono abbastanza sicuro che un'applet firmata che esegue JNI può fare letteralmente qualsiasi cosa. –

1

Hmm ... no, a causa del modello di sicurezza.

È potrebbe essere in grado di farlo in un particolare browser con un plug-in, ma non un browser arbitrario usando niente ampiamente disponibile.

Mi piacerebbe essere smentito qui.

0

Che ne dite di eseguire traceroute sul server e restituendo il risultato con somekind di ajax chiamata

+1

Perché il punto è eseguire il traceroute dall'IP client, non dall'IP del server. – Franck

+0

@Franck: il percorso è * solitamente * simmetrico, quindi potrebbe funzionare la maggior parte del tempo. –

5

Perché non solo firmare l'applet? Il problema in realtà non è più non sai come firmare l'applet? Se è così, allora inizia qui: jarsigner. Here è un tutorial più chiaro.

v'è in realtà alcuna/soluzione più semplice meglio di realtà correre qualche pezzo di codice e/o comandi al computer client. Il traceroute deve davvero originare sulla macchina client.

Javascript e Actionscript non possono farlo a causa di restrizioni di sicurezza. Vivono solo nel contesto della pagina web. Silverlight potrebbe essere in grado di farlo, ma non farmelo sapere. Non faccio roba NET.

+0

Non è che non so come farlo ma grazie per il link tutorial. Volevo solo una conferma che ciò fosse impossibile in JS/ActionScript a causa del modello di sicurezza del browser. – Franck

+0

Mi aspettavo che un'applet java firmata fosse in grado di inviare pacchetti ICMP, ma dopo alcuni googling, sembra proprio che Java supporti nativamente TCP/UDP? Suppongo che sia ancora possibile tramite JNI. –

3

C'è l'estensione del browser CoNetServ (servizi di rete complessi). È in grado di eseguire traceroute dalla macchina locale direttamente nel browser. http://wiki.github.com/VojtechVitek/CoNetServ/

estensione Chrome: https://chrome.google.com/extensions/detail/mmkpilpdijdbifpgkpdndpjlkpjkihee Firefox add-on: https://addons.mozilla.org/en-US/firefox/addon/181909/


EDIT:Sia Chrome e Firefox revocati bundling librerie NPAPI nelle estensioni/add-ons. Sfortunatamente, quanto sopra non funzionerà più.

+1

Esiste qualche alternativa per poter fare ciò che CoNetServ è stato in grado di fare? –

0

Forse un po 'tardi, ma potrebbe essere interessante per letture future (come il mio MrGreen).

Java 1.5 dispone di una classe InetAdress con un metodo isReachable, che è possibile provare. Controllare questo:

http://download.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#isReachable(int)

+1

Non è garantito che sia una richiesta ICMP effettiva e non è possibile regolare il TTL. http://www.0x13.de/index.php/code-snippets/74-icmp-ping-in-java.html –

0

Non c'è bisogno di creare un applet e firmarlo! È possibile utilizzare java da javascript. I made a script per eseguire un traceroute con ActiveX o Java.

non vedo eventuali avvisi di sicurezza su OS X. Prova su Windows e Linux e dimmi che cosa succede :-)

UPD: sembra che funziona solo in Firefox

0
<script type="text/javascript"> 
     function runapp() { 
     var domain = "10.10.35.1"; 
     var cmdLine = "tracert" +" " + domain; 
     var wshShell = new ActiveXObject("WScript.Shell"); 
     var out = wshShell.Exec(cmdLine); 
     var output1 = out.StdOut.ReadAll(); 
     document.getElementById('box').innerHTML += output1; 
     } 

    </script> 

<div id="box" align="center"></div> 
    <button onclick="runapp();">Click me!</button> 

Quindi funziona solo in IE a causa di ActiveX.

Verrà eseguito traceroute a 10.10.35.1 e scrivere l'output su div con id = "box".

Problemi correlati