tag:forum.selfhtml.org,2005:/self gemeinsame Route bestimmen – SELFHTML-Forum 2020-05-06T06:08:49Z https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769992#m1769992 me-too 2020-05-03T18:04:14Z 2020-05-03T18:04:14Z gemeinsame Route bestimmen <p>Hallo Forum,</p> <p>wie kann ich in</p> <p>[1] PHP<br> [2] Javascript</p> <p>die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?</p> <pre><code class="block language-text">IP[1] = 192.168.130.1 IP[2] = 192.168.129.2 CIDR-Suffix: /22 Netmask v4: 255.255.252.0 Supernet: 192.168.128.0 </code></pre> <p>und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.</p> <p>Daran rätsele ich nun schon den ganzen Tag.</p> <p>Grüße aus der Quasi-Quarantäne<br> Me</p> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769995#m1769995 Der Martin 2020-05-03T19:14:09Z 2020-05-03T19:14:09Z gemeinsame Route bestimmen <p>Hallo,</p> <blockquote> <p>wie kann ich in</p> <p>[1] PHP<br> [2] Javascript</p> <p>die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?</p> </blockquote> <p>die Aufgabenstellung ist völlig unabhängig von der gewählten Programmiersprache.</p> <blockquote> <pre><code class="block language-text">IP[1] = 192.168.130.1 IP[2] = 192.168.129.2 CIDR-Suffix: /22 Netmask v4: 255.255.252.0 Supernet: 192.168.128.0 </code></pre> </blockquote> <p>Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.</p> <blockquote> <p>und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.</p> </blockquote> <p>Was verstehst du in dem Kontext unter <em>gültig</em>?<br> Und wozu brauchst du das?</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769999#m1769999 TS ts-self@online.de https://bitworks.de 2020-05-03T20:20:48Z 2020-05-03T21:40:05Z gemeinsame Route bestimmen <p>Hello,</p> <p>Grundidee für PHP:<br> erstmal die Übereinstimmungen suchen</p> <pre><code class="block language-php"> <span class="token variable">$supernet_long</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$iplong_1</span> <span class="token operator">&</span> <span class="token variable">$iplong_2</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token operator">~</span><span class="token variable">$iplong_1</span> <span class="token operator">&</span> <span class="token operator">~</span><span class="token variable">$iplong_2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Aber Achtung, das ist ggf. eine 64-Bit-Zahl, deshalb beim Weiterarbeiten mit <code>decbin()</code> nur die rechten 32 Stellen benutzen <code>substr(..., -32)</code>. Darin mit <code>strpos()</code> die Position der ersten "0" bestimmen. Das ist dann schon das CIDR-Suffix.</p> <p>Die Bitmaske ist dann der linke Teil bis zur "0", aufgefüllt auf 32 Stellen mit "0". Zurückwandeln mit <code>bindec()</code>.</p> <p>Die Netz-IP ergibt sich dann wieder aus <code>Bitmaske & IP[x]</code> (egal welche von beiden) + CIDR-Suffix.</p> <p>Für den IP-Check kann man auch <code>filter_var()</code> benutzen.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769996#m1769996 me-too 2020-05-03T19:21:56Z 2020-05-03T19:21:56Z gemeinsame Route bestimmen <p>Hallo Martin,</p> <blockquote> <blockquote> <p>wie kann ich in</p> <p>[1] PHP<br> [2] Javascript</p> <p>die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?</p> </blockquote> <p>die Aufgabenstellung ist völlig unabhängig von der gewählten Programmiersprache.</p> <blockquote> <pre><code class="block language-text">IP[1] = 192.168.130.1 IP[2] = 192.168.129.2 CIDR-Suffix: /22 Netmask v4: 255.255.252.0 Supernet: 192.168.128.0 </code></pre> </blockquote> <p>Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.</p> </blockquote> <p>Ja nee is schon klar.<br> Und wie geht das?</p> <blockquote> <blockquote> <p>und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.</p> </blockquote> <p>Was verstehst du in dem Kontext unter <em>gültig</em>?</p> </blockquote> <p>192.168.130.300 wäre ungültig. Und IPv6 wäre in demselben Zusammenhang auch nicht angebracht.</p> <blockquote> <p>Und wozu brauchst du das?</p> </blockquote> <p>Um Routen im Netzwerk zusammenfassen zu können</p> <p>Es geht mir um die Lösungswege in Javascript oder PHP.</p> <p>Grüße Me-Too</p> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769997#m1769997 Der Martin 2020-05-03T19:36:09Z 2020-05-03T19:36:09Z gemeinsame Route bestimmen <p>n'Abend,</p> <blockquote> <blockquote> <p>Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.</p> </blockquote> <p>Ja nee is schon klar.<br> Und wie geht das?</p> </blockquote> <p>worin besteht genau dein Problem?</p> <p>Eine IPv4-Adresse ist eine 32bit-Integerzahl. Das höchstwertige Bit entspricht der Bitmaske 0x80000000. Damit fängst du an. Mit jedem Schritt verschiebst du die Bitmaske um eine Position nach rechts.</p> <blockquote> <blockquote> <blockquote> <p>und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.</p> </blockquote> <p>Was verstehst du in dem Kontext unter <em>gültig</em>?</p> </blockquote> <p>192.168.130.300 wäre ungültig.</p> </blockquote> <p>Oh. Okay, das habe ich als Grundwissen vorausgesetzt. Natürlich kann in einem Byte niemals ein Zahlenwert >255 dargestellt werden.</p> <blockquote> <p>Und IPv6 wäre in demselben Zusammenhang auch nicht angebracht.</p> </blockquote> <p>Ja, IPv6 ist eine vollkommen andere Welt.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769998#m1769998 Rolf B 2020-05-03T20:01:06Z 2020-05-03T20:06:07Z gemeinsame Route bestimmen <p>Hallo me-too,</p> <blockquote> <p>Ja nee is schon klar.</p> </blockquote> <p>Mit weniger Rotzigkeit</p> <blockquote> <p>Und wie geht das?</p> </blockquote> <p><a href="https://www.php.net/manual/en/language.operators.bitwise.php" rel="nofollow noopener noreferrer">Und mehr Handbuchstudium</a></p> <p><a href="https://www.php.net/manual/de/function.ip2long.php" rel="nofollow noopener noreferrer">Noch mehr</a></p> <p>ip2long konvertiert den IP-String in einen 32-bit Wert, oder liefert FALSE, wenn der IP-String ungültig war.</p> <p>Für den Bitvergleich beginnst Du mit $mask=0x80000000 und schiebst den Maskenwert Stück für Stück mit dem >> Operator eins nach rechts, bis die Maske 0 wird. Der Rest ist wohl trivial.</p> <p>In JavaScript ist's schwieriger, da müsstest Du ip2long und long2ip selbst bauen. Das ist nicht unmöglich, nur etwas lästiger. <a href="https://gist.github.com/jppommet/5708697" rel="nofollow noopener noreferrer">Hier</a> sind zwei Einzeiler, die das tun, aber da fehlt bei ip2int die Prüfung auf Gültigkeit. Kannst Du vielleicht hinzufügen. Bitoperatoren hat JavaScript auch.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770002#m1770002 me-too 2020-05-04T04:31:24Z 2020-05-04T04:31:24Z gemeinsame Route bestimmen <blockquote> <p>Mit weniger Rotzigkeit</p> </blockquote> <p>Mit besten Wünschen zurück.</p> <blockquote> <blockquote> <p>Und wie geht das?</p> </blockquote> <p><a href="https://www.php.net/manual/en/language.operators.bitwise.php" rel="nofollow noopener noreferrer">Und mehr Handbuchstudium</a></p> </blockquote> <p>Einfach nur einen Link hinzurotzen ist keine wirkliche Hilfe. Den <a href="https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769999#m1769999" rel="noopener noreferrer">entscheideden Tipp</a> habe ich nun von jemand Anderem bekommen.</p> <p>Grüße Me-Too</p> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770003#m1770003 me-too 2020-05-04T04:45:38Z 2020-05-04T04:45:38Z gemeinsame Route bestimmen <p>Hallo TS,</p> <p>soweit hat es schon funktioniert. Der entscheidende Tipp war die Negierung (~) im zweiten Teil.</p> <p>Und dann hat mich irritiert, dass decbin da plötzlich 64 Stellen hatte. Aber führende Nullen werden eben nicht angezeigt. Wie soll man da auf was kommen, was man nicht sieht?</p> <blockquote> <p>Für den IP-Check kann man auch <code>filter_var()</code> benutzen.</p> </blockquote> <p>Gibt es auch ein Filterflag für nur interne Netze?<br> Da hänge ich jetzt noch.</p> <p>Wie kann ich Dir einen Punkt geben?</p> <p>Grüße und Dank<br> Me-Too</p> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770004#m1770004 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2020-05-04T06:11:01Z 2020-05-04T06:11:01Z gemeinsame Route bestimmen <p>@@me-too</p> <blockquote> <p>Wie kann ich Dir einen Punkt geben?</p> </blockquote> <p>Da rotz ich auch einfach mal <a href="https://wiki.selfhtml.org/wiki/SELFHTML:Forum/Bewertungsregeln#einen_Beitrag_bewerten_k.C3.B6nnen" rel="nofollow noopener noreferrer">einen Link</a> hin.</p> <p lang="en"> Stay hard! Stay hungry! Stay alive! <strong>Stay home!</strong></p> <div class="signature">-- <br> Home Office ist so frustierend, weil man jetzt noch viel stärker bemerkt mit wievielen Menschen man zu tun hat, die nicht sinnerfassend lesen können. (<a href="https://twitter.com/Grantscheam/status/1247046064504537092" rel="nofollow noopener noreferrer">@Grantscheam</a>) </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770005#m1770005 TS ts-self@online.de https://bitworks.de 2020-05-04T06:30:34Z 2020-05-04T13:46:26Z gemeinsame Route bestimmen <p>Hello,</p> <blockquote> <blockquote> <p>Für den IP-Check kann man auch <code>filter_var()</code> benutzen.</p> </blockquote> <p>Gibt es auch ein Filterflag für nur interne Netze?<br> Da hänge ich jetzt noch.</p> </blockquote> <p>Das sieht <a href="https://www.php.net/manual/en/filter.filters.flags.php" rel="nofollow noopener noreferrer">im Handbuch</a> nicht so aus. Aber das kannst Du nach Abschluss der übrigen Filterung doch einfach durch drei (?) Stringvergleiche (strpos($ip, $erlaubt) === 0) für die erlaubten privaten IPv4-Netze prüfen.</p> <p>Oh nee: Für die B-Netze wird es wohl etwas aufwändiger. Der <a href="https://www.heise.de/Reservierte-IPv4-Adressen-3484192.html" rel="nofollow noopener noreferrer">Bereich</a> geht da ja von 172.16.0.0 bis <s>172.32.255.255</s> 172.31.255.255.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770006#m1770006 Rolf B 2020-05-04T07:18:20Z 2020-05-04T07:18:20Z gemeinsame Route bestimmen <p>Hallo Tom,</p> <p>Die Erkenntnis, ob ein String eine IPv4 enthält oder nicht, gewinnt man bereits mit ip2long. Ob er eine private oder reservierte IPv4 darstellt, ist durch Abfragen eines Präfix auf String-Ebene nicht so einfach. Bei 10. und 192.168. gelingt es, beim 172.16.0.0/12 Präfix nicht. Das sind die Adressen von 172.16.0.0 bis 172.31.255.255. Es ist besser, das in der Darstellung als Integer mit den Masken<br> <code>($ipLong & 0xff000000) == 0x0a000000</code>,<br> <code>($ipLong & 0xfff00000) == 0xac100000</code> und<br> <code>($ipLong & 0xffff0000) == 0xc0a80000</code><br> zu prüfen.</p> <p>Außer den privaten gibt's auch noch die reservierten Netze. Sind die relevant?</p> <p>Man könnte auch überlegen, die <a href="https://www.php.net/manual/en/filter.filters.validate.php" rel="nofollow noopener noreferrer">Filter-Flags</a> von FILTER_VALIDATE_IP vorschlagen? Die liefern FALSE, wenn die IP im privaten oder reservierten Range ist, und kapseln den ganzen Kram.</p> <p>BTW ist <code>(a & b) | (~a & ~b)</code> ist ein cleverer Trick, um die Bits zu finden, wo a und b gleich sind.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770130#m1770130 TS ts-self@online.de https://bitworks.de 2020-05-06T06:08:49Z 2020-05-06T06:13:18Z gemeinsame Route bestimmen <p>Hello,</p> <blockquote> <p>Hello,</p> <blockquote> <blockquote> <p>Für den IP-Check kann man auch <code>filter_var()</code> benutzen.</p> </blockquote> <p>Gibt es auch ein Filterflag für nur interne Netze?<br> Da hänge ich jetzt noch.</p> </blockquote> <p>Das sieht <a href="https://www.php.net/manual/en/filter.filters.flags.php" rel="nofollow noopener noreferrer">im Handbuch</a> nicht so aus. Aber das kannst Du nach Abschluss der übrigen Filterung doch einfach durch drei (?) Stringvergleiche (strpos($ip, $erlaubt) === 0) für die erlaubten privaten IPv4-Netze prüfen.</p> <p>Oh nee: Für die B-Netze wird es wohl etwas aufwändiger. Der <a href="https://www.heise.de/Reservierte-IPv4-Adressen-3484192.html" rel="nofollow noopener noreferrer">Bereich</a> geht da ja von 172.16.0.0 bis <s>172.32.255.255</s> 172.31.255.255.</p> </blockquote> <p>Da muss man also das <a href="http://jodies.de/ipcalc?host=172.16.0.0&mask1=12" rel="nofollow noopener noreferrer">Bitmuster</a> betrachten:</p> <p><code>($ipLong & 0xfff00000) == 0xac100000</code></p> <p>wie <a href="https://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1770006#m1770006" rel="noopener noreferrer">RolfB</a> schon schrieb.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div>