tag:forum.selfhtml.org,2005:/selfgemeinsame Route bestimmen – SELFHTML-Forum2020-05-06T06:08:49Zhttps://forum.selfhtml.org/self/2020/may/03/gemeinsame-route-bestimmen/1769992#m1769992me-too2020-05-03T18:04:14Z2020-05-03T18:04:14Zgemeinsame 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#m1769995Der Martin2020-05-03T19:14:09Z2020-05-03T19:14:09Zgemeinsame 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#m1769999TSts-self@online.dehttps://bitworks.de2020-05-03T20:20:48Z2020-05-03T21:40:05Zgemeinsame 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#m1769996me-too2020-05-03T19:21:56Z2020-05-03T19:21:56Zgemeinsame 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#m1769997Der Martin2020-05-03T19:36:09Z2020-05-03T19:36:09Zgemeinsame 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#m1769998Rolf B2020-05-03T20:01:06Z2020-05-03T20:06:07Zgemeinsame 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#m1770002me-too2020-05-04T04:31:24Z2020-05-04T04:31:24Zgemeinsame 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#m1770003me-too2020-05-04T04:45:38Z2020-05-04T04:45:38Zgemeinsame 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#m1770004Gunnar Bittersmannselfhtml@bittersmann.dehttps://bittersmann.de2020-05-04T06:11:01Z2020-05-04T06:11:01Zgemeinsame 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#m1770005TSts-self@online.dehttps://bitworks.de2020-05-04T06:30:34Z2020-05-04T13:46:26Zgemeinsame 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#m1770006Rolf B2020-05-04T07:18:20Z2020-05-04T07:18:20Zgemeinsame 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#m1770130TSts-self@online.dehttps://bitworks.de2020-05-06T06:08:49Z2020-05-06T06:13:18Zgemeinsame 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>