Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in Assert und Eval in PHP (Codebeispiel)

Detaillierte Einführung in Assert und Eval in PHP (Codebeispiel)

不言
不言nach vorne
2019-03-16 11:54:464698Durchsuche

Der Inhalt dieses Artikels ist eine detaillierte Einführung (Codebeispiel) zum Thema Assert und Eval. Ich hoffe, dass er für Sie hilfreich ist.

assert Bestimmt, ob ein Ausdruck wahr ist. Gibt true oder false zurück;

<?php
$s = 123;
assert("is_int($s)");
?>

Aus diesem Beispiel können Sie ersehen, dass der String-Parameter ausgeführt wird, der eval() ähnelt.

Eval($code_str) führt jedoch nur $code_str aus, der der PHP-Codierungsspezifikation entspricht.

eval(): Diese Funktion ist nützlich, um Code für spätere Berechnungen in einem Datenbanktextfeld zu speichern. (Es wird auch empfohlen, less in der Produktion zu verwenden)
Hinweis: 1.eval() muss eine Zeichenfolge sein;

eval Definition und Verwendung:

(1) Die eval( )-Funktion berechnet den String entsprechend dem PHP-Code (Berechnung = Ausführung).
(2)Die Zeichenfolge muss legaler PHP-Code sein und mit einem Semikolon enden.
(3) Wenn in der Codezeichenfolge keine Return-Anweisung aufgerufen wird, wird NULL zurückgegeben. Wenn im Code ein Parsing-Fehler vorliegt, gibt die Funktion eval() false zurück

Die Verwendung von Assertion ist etwas detaillierter. assert_option() kann verwendet werden, um Assert(); einige Einschränkungen und Kontrollen aufzuerlegen;Standardwert
ASSERT_ACTIVE=1 //Assert-Funktionsschalter
ASSERT_WARNING =1 // Wenn der Ausdruck falsch ist, ob eine Warnmeldung ausgegeben werden soll, eine PHP-Warnung für jede fehlgeschlagene Behauptung ausgeben
ASSERT_BAIL= 0 //Ob die Ausführung beendet werden soll; Ausführung bei fehlgeschlagenen Behauptungen beenden
ASSERT_QUIET_EVAL= 0 // Ob um Fehleraufforderungen beim Ausführen von Ausdrücken zu deaktivieren; error_reporting während der Auswertung von Assertionsausdrücken deaktivieren
ASSERT_CALLBACK= (NULL) // Ob die Rückruffunktion gestartet werden soll, Benutzerfunktion zum Aufrufen bei fehlgeschlagenen Assertionen

Die offizielle Dokumentation von PHP ist Es wird empfohlen, Assert zum Debuggen zu verwenden. Wir können feststellen, dass es auch einen Schalter ASSERT_ACTIVE gibt, mit dem gesteuert werden kann, ob das Debuggen aktiviert werden soll.

Nun stellt sich die Frage: Ist dies machbar, wenn der Programmierer während der Entwicklung viel Assert() im Code belässt und dann die Ausführung abschaltet, wenn das Programm freigegeben wird? Gibt es Sicherheitsprobleme?


Da die Hauptfunktion von Assert das Debuggen ist, behalten Sie es nicht bei, wenn das Programm veröffentlicht wird. Es ist unklug, „asser“ zur Beurteilung von Ausdrücken in einem Programm zu verwenden. Der erste Grund ist, dass „asser“ in der Produktionsumgebung möglicherweise deaktiviert ist, sodass „asser“ nicht vollständig vertrauenswürdig ist ; und Wenn ASSERT_ACTIVE=1 in der Produktionsumgebung festgelegt ist, kann diese Ausdruckszeichenfolge ausgeführt werden, was wiederum Sicherheitsrisiken birgt.

Code-Injection durch Assertion

Zum Beispiel

<?php
function fo(){
  $fp = fopen("c:/test.php",&#39;w&#39;);
  fwrite($fp,"123");
  fclose($fp);
  return true;
}
assert("fo()");
?>

Hinweis: Assertion führt den gesamten String-Parameter als PHP-Code aus und eval führt legalen PHP-Code aus.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Assert und Eval in PHP (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen