Die STRNCMP -Funktion ist eine Funktion, die von PHP zum Vergleich von zwei Zeichenfolgen bereitgestellt wird. Im Gegensatz zu STRCMP vergleicht sich STRNCMP innerhalb der angegebenen Anzahl von Zeichen, sodass es genauer und sicherer ist als normale String -Vergleiche. Die Syntax der STRNCMP -Funktion lautet wie folgt:
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>
$ str1 : Die erste Zeichenfolge.
$ str2 : die zweite Zeichenfolge.
$ Länge : Die maximale Anzahl von Zeichen zu vergleichen.
Diese Funktion gibt einen Ganzzahlwert zurück und die folgenden Situationen zurück, basierend auf der Größenbeziehung der beiden Zeichenfolgen:
Ein Rückgabewert von 0 bedeutet, dass die beiden Zeichenfolgen in der angegebenen Länge genau gleich sind.
Der Rückgabewert beträgt weniger als 0, bedeutet, dass $ str1 weniger als $ str2 ist.
Der Rückgabewert ist größer als 0 bedeutet, dass $ str1 größer als $ str2 ist.
In PHP sind häufig verwendete String -Vergleichsfunktionen STRCMP und STRCASECMP . Diese Funktionen vergleichen die gesamte Zeichenfolge von Anfang bis Ende. In Sicherheitsanwendungen kann die Verwendung dieser Funktionen jedoch direkt einige potenzielle Risiken darstellen, insbesondere angesichts der Zeitangriffe.
Zeitangriff ist ein Angriff, der den Dateninhalt färbt, indem der Zeitunterschied in einem System im Vergleich von Vorgängen gemessen wird. Ein Angreifer kann allmählich die richtige Zeichenfolge schließen, indem er ständig verschiedene Zeichenfolgen ausprobiert und auf der Zeit, die durch den Vergleichsvorgang verbraucht wird.
Beispielsweise vergleichen die Funktionen von STRCMP und STRCASECMP zwei Zeichenfolgencharakter mit dem Charakter und geben das Ergebnis zurück, wenn der erste nicht übereinstimmende Charakter gefunden wird. Dies bedeutet, dass, wenn die ersten Zeichen der beiden Zeichenfolgen gleich sind, die Funktion mehr Zeit dauert, um die nachfolgenden Zeichen zu vergleichen. Angreifer können dies nutzen, um durch wiederholte Versuche die richtige Charakterreihenfolge zu finden.
Die STRNCMP -Funktion ermöglicht es Entwicklern, die Anzahl der Zeichen, die Strings vergleichen, zu begrenzen. Dies bedeutet, dass STRNCMP selbst wenn die ersten Ziffern der beiden Zeichenfolgen gleich sind, nur die angegebene Zeichenlänge vergleichen und andere Zeichen nicht weiter vergleichen, wodurch die Möglichkeit reduziert wird, die Zeichenfolge nach Zeitunterschied zu schließen. In Kombination mit der genauen Kontrolle der STRNCMP -Funktion kann es potenzielle Zeitangriffe effektiv vermeiden.
Bei einem sicheren String -Vergleich kann STRNCMP auf folgende Weise verwendet werden:
Wenn Sie zwei Zeichenfolgen mit fester Länge vergleichen müssen, können Sie die zu vergleichens Anzahl der Zeichen direkt angeben. Zum Beispiel, wenn wir zwei Hashes mit Länge 16 vergleichen müssen:
<span><span><span class="hljs-variable">$hash1</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$hash2</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$hash1</span></span><span>, </span><span><span class="hljs-variable">$hash2</span></span><span>, </span><span><span class="hljs-number">32</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Die beiden Hashes sind gleich'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Unterschiedliche Hash -Werte'</span></span><span>;
}
</span></span>
In diesem Beispiel verwenden wir die STRNCMP -Funktion, um den Vergleich von nur 32 Zeichen zu begrenzen, sodass Zeitangriffe vermieden werden können.
Wenn wir das vom Benutzer eingegebene Kennwort oder andere sensible Daten überprüfen müssen, sollten wir versuchen, die Verwendung von STRCMP direkt zu vermeiden. Der vom Benutzer eingegebene und gespeicherte Kennwort -Hash -Wert kann mit STRNCMP verglichen werden. Zum Beispiel:
<span><span><span class="hljs-variable">$userInput</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$storedHash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$4.2T70akfYlBpgk2JqJbVvDrzVX9pIHH9RbHg5bWlfu'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$userInput</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>, </span><span><span class="hljs-number">60</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Passwort erfolgreich anpassen'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Fehlerkennwort'</span></span><span>;
}
</span></span>
In diesem Beispiel gehen wir davon aus, dass der Benutzer ein Passwort eingegeben und mit dem gespeicherten Hash -Wert verglichen hat. Durch die Begrenzung der Anzahl der Zeichen im Vergleich zu 60 gewährleisten wir Sicherheit.
Obwohl STRNCMP ein gewisses Sicherheitsgrad liefert, bietet PHP auch eine weitere Funktion für sichere String -Vergleiche - Hash_equals . Hash_equals ist speziell entwickelt, um Zeitangriffe zu vermeiden. Es wird nicht durch die Stringlänge oder die Ähnlichkeit inhaltsbezogen. Daher ist es eine bessere Wahl für Hash -Vergleiche. Die Verwendung ist wie folgt:
<span><span><span class="hljs-variable">$expected</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$actual</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$expected</span></span><span>, </span><span><span class="hljs-variable">$actual</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Der Hash -Wert ist der gleiche'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Unterschiedliche Hash -Werte'</span></span><span>;
}
</span></span>
Während Hash_equals eine höhere Sicherheit bietet, ist STRNCMP in einigen Fällen immer noch eine praktikable Option, wenn wir nur Teilzeichen vergleichen (z. B. die ersten 32 Zeichen eines Hash -Werts).
Beim Vergleich von Zeichenfolgen sollte die Sicherheit einer der ersten Faktoren sein, die wir berücksichtigen. Durch die Verwendung von PHPs STRNCMP -Funktion kann das Risiko von Zeitangriffen effektiv verringert werden, insbesondere beim Vergleich von Zeichenfolgen fester Länge, was den Entwicklern helfen kann, die Anwendungssicherheit zu verbessern. STRNCMP ist jedoch nicht omnipotent, und für komplexere Sicherheitsanforderungen (z. B. einen vollständigen Vergleich der Hash -Werte) wäre die Verwendung der Funktion von Hash_equals eine idealere Wahl.
Durch die rationale Auswahl der String -Vergleichsmethode können Sie sicherstellen, dass Ihre PHP -Anwendung sicherer und zuverlässiger ist und die sensiblen Informationen der Benutzer vor potenziellen Angriffen schützt.