Heim  >  Artikel  >  php教程  >  PHP-XFocus-Anti-Injection-Informationen

PHP-XFocus-Anti-Injection-Informationen

黄舟
黄舟Original
2016-12-14 11:49:501058Durchsuche

Hier gibt es keinen tiefgreifenden technischen Inhalt, ich habe nur kurz darüber gesprochen. (Wenn es keine spezifische Erklärung gibt, basieren die folgenden Vorgänge alle auf PHP+MySQL+Apache.) Wenn jetzt verschiedene Hacker weit verbreitet sind, ist es eine sehr schwierige Frage, wie Sie die Sicherheit Ihres eigenen PHP-Codes realisieren und die Sicherheit des Programms und des Servers gewährleisten können Wichtiges Thema: Nachdem ich mir die Informationen zur PHP-Sicherheit angesehen habe, gibt es nicht viel, zumindest viel weniger als ASP, haha, also wollte ich etwas schreiben, um diese möglichen Situationen zu verhindern. Hier gibt es keinen tiefgreifenden technischen Inhalt, ich habe nur kurz darüber gesprochen. (Wenn es keine spezifische Erklärung gibt, basieren die folgenden Vorgänge alle auf der Situation von PHP+MySQL+Apache)
Lassen Sie uns zunächst über Sicherheitsprobleme sprechen. Der obige Artikel ist im Wesentlichen ein Artikel über PHP-Sicherheit führt PHP umfassend in einige Sicherheitsprobleme ein.

Wenn Sie beim Codieren in PHP einige grundlegende Sicherheitsaspekte berücksichtigen, gehen Sie zunächst wie folgt vor:
1. Initialisieren Sie Ihre Variablen.

Warum sagen Sie das? Schauen wir uns den folgenden Code an:
if ($admin)
{
echo 'Anmeldung erfolgreich! ';
include('admin.php');
}
else
{
echo 'Sie sind kein Administrator und können nicht verwalten! ';
}

Okay, wir sehen, dass der obige Code normal zu laufen scheint und es kein Problem gibt. Was wird der Effekt sein? Denken Sie darüber nach: Sind wir direkt die Administratoren und verwalten sie direkt?
Natürlich machen wir vielleicht keinen so einfachen Fehler, und einige sehr geheime Fehler können dieses Problem auch verursachen. Beispielsweise gibt es im PHPWind 1.3.6-Forum eine kürzlich aufgedeckte Sicherheitslücke, die es uns ermöglicht Um direkt Administratorrechte zu erhalten, liegt dies daran, dass eine $skin-Variable nicht initialisiert ist, was später zu einer Reihe von Problemen führt.

Wie vermeiden wir also die oben genannten Probleme? Beginnen Sie zunächst mit php.ini und setzen Sie register_global = off in php.ini. Dies bedeutet, dass nicht alle registrierten Variablen global sind, sodass dies vermieden werden kann. Wir sind jedoch keine Serveradministratoren und können ihn nur anhand des Codes verbessern. Wie können wir den obigen Code verbessern? Wir schreiben es wie folgt um:
$admin = 0; // Variablen initialisieren
if ($_POST['admin_user'] && $_POST['admin_pass'])
{
// Bestimmen Sie die übermittelte Verwaltung Der entsprechende Verarbeitungscode ist, ob der Benutzername und das Passwort korrekt sind
// ...
$admin = 1
}
else
{
$admin = 0;
}

if ($admin)
{
echo 'Anmeldung erfolgreich! ';
include('admin.php');
}
else
{
echo 'Sie sind kein Administrator und können nicht verwalten! ';
}

Da wir die Variable zu Beginn auf $admin = 0 initialisiert haben, können Sie durch diese Sicherheitslücke keine Administratorrechte erhalten.


2. SQL-Injection verhindern (SQL-Injection)

SQL-Injection sollte derzeit das schädlichste Programm sein, einschließlich des frühesten von ASP zu PHP, im Grunde genommen in den letzten zwei Jahren China Das Grundprinzip der beliebten Technologie besteht darin, einen Injektionspunkt zu bilden, indem übermittelte Variablen nicht gefiltert werden, und es dann böswilligen Benutzern zu ermöglichen, einige SQL-Abfrageanweisungen zu übermitteln, was dazu führt, dass wichtige Daten gestohlen werden, Daten verloren gehen oder beschädigt werden oder in die Backend-Verwaltung eingedrungen wird.
Da wir nun die grundlegenden Methoden der Injektionsinvasion verstanden haben, wie können wir sie verhindern? Wir sollten mit dem Code beginnen.

Wir wissen, dass es zwei Möglichkeiten gibt, Daten im Web zu übermitteln: eine ist Get und die andere ist Post. Daher beginnen viele gängige SQL-Injektionen mit der Get-Methode und die Injektionsanweisung muss eine SQL-Anweisung enthalten. Da es keine SQL-Anweisung gibt, wie geht man vor? Die SQL-Anweisung besteht aus vier Hauptsätzen:
Auswählen, Aktualisieren, Löschen, Einfügen. Können wir diese Probleme vermeiden, wenn wir die von uns übermittelten Daten filtern?
Also verwenden wir reguläre Ausdrücke, um die folgende Funktion zu erstellen:

/*
Funktionsname: inject_check()
Funktionsfunktion: Erkennen Sie, ob der übermittelte Wert SQL-Injection-Zeichen enthält, um die Injektion zu verhindern. Schützen Sie die Serversicherheit
Parameter: $sql_str: Übermittelte Variable
Rückgabewert: Gibt das Erkennungsergebnis zurück, wahr oder falsch
Funktionsautor: heiyeluren
*/
Funktion inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // Filter
}

In unserer Funktion filtern wir alle gefährlichen Parameterzeichenfolgen wie „select“, „insert“, „update“, „delete“, „union“, „into“, „load_file“, „outfile /*, ./, ../, '“ usw. heraus. Dann können Sie die übermittelten Parameter steuern. Das Programm kann wie folgt aufgebaut werden:

if (inject_check($_GET['id']))
{
exit('Die von Ihnen übermittelten Daten sind illegal, bitte überprüfen und erneut übermitteln!');
else
{
$id = $_GET['id'];
echo 'Die übermittelten Daten sind legal, bitte fahren Sie fort! ';
}
?>
Unsere entspricht den oben genannten Regeln, erfüllt jedoch nicht die Anforderungen. Daher erstellen wir für andere Situationen eine Funktion zur Überprüfung:

/*

Funktionsname: verify_id()
Funktionsfunktion: Überprüfen, ob der übermittelte ID-Klassenwert zulässig ist
Parameter: $id: Übermittelter ID-Wert
Rückgabewert: Die verarbeitete ID zurückgeben
Funktionsautor: heiyeluren
*/
function verify_id($id=null)
{
if (!$id) { exit('Keine Parameter übermittelt! '); // Beurteilung, ob es ist leer
elseif (inject_check($id)) { exit('Der übermittelte Parameter ist illegal!' } // Beurteilung der Injektion
elseif (!is_numeric($id)) { exit('The Der übermittelte Parameter ist illegal!'); Dann können wir eine Überprüfung durchführen, sodass unser obiger Programmcode wie folgt aussieht:

if (inject_check($_GET['id']))

{

exit('Die von Ihnen übermittelten Daten sind illegal , bitte überprüfen und erneut einreichen!');
}

else

{

$id = verify_id($_GET['id']) ; // Unsere Filterfunktion wird hier zitiert, um $id zu filtern

echo „Die übermittelten Daten sind legal, bitte fahren Sie fort!“ ';
}
?>

Okay, das Problem scheint hier gelöst zu sein, aber haben wir die per Post übermittelten Daten und die große Datenmenge berücksichtigt?
Zum Beispiel können einige Zeichen der Datenbank schaden, wie zum Beispiel „_“, „%“. Diese Zeichen haben eine besondere Bedeutung. Was ist, wenn wir sie kontrollieren? Ein weiterer Punkt ist, dass, wenn magic_quotes_gpc = off in unserer php.ini, den übermittelten Daten, die nicht den Datenbankregeln entsprechen, nicht automatisch ein „“ vorangestellt wird. Dann müssen wir diese Probleme kontrollieren, also erstellen wir sie wie folgt:

/*
Funktionsname: str_check()
Funktionsfunktion: Filtern Sie die übermittelte Zeichenfolge.

Parameter: $var: die zu verarbeitende Zeichenfolge.

Rückgabewert: Geben Sie die gefilterte Zeichenfolge zurück
Funktionsautor: heiyeluren

*/

function str_check( $str )
{
if (!get_magic_quotes_gpc()) // Bestimmen Sie, ob magic_quotes_gpc aktiviert ist
{
$str = addslashes($str); // Filter
}
$str = str_replace("_", "_", $str); // Filtern Sie '_'
$str = str_replace ("%", "%", $str); // Filter out ' % '

return $str; Der Server ist kompromittiert.

Abschließend überlegen Sie, ob Sie einige große Datenmengen übermitteln möchten, z. B. zum Posten oder Schreiben von Artikeln oder Nachrichten. Basierend auf den oben genannten Funktionen erstellen wir die folgende Funktion:

/*
Funktionsname: post_check()

Funktionsfunktion: Verarbeiten Sie den übermittelten Bearbeitungsinhalt

Parameter: $post: Der zu übermittelnde Inhalt
Rückgabewert: $post: Rückgabe gefilterter Inhalt

Funktionsautor: heiyeluren

*/

function post_check($post)

{

if (!get_magic_quotes_gpc()) // Bestimmen Sie, ob magic_quotes_gpc geöffnet ist

{
$post = addslashes($post); // Übermittelte Daten filtern, wenn magic_quotes_gpc nicht aktiviert ist
}
$post = str_replace("_", "_", $ post); _'
$post = str_replace("%", "%", $post); // Herausfiltern ' % ​​'
$post = nl2br($post) ; // Konvertierung eingeben
$post = htmlspecialchars($post); // HTML-Tag-Konvertierung

return $post; Zumindest habe ich nur über zwei Aspekte gesprochen, und beim nächsten Mal werde ich über sehr wenig Inhalt sprechen, einschließlich PHP-Sicherheitskonfiguration, Apache-Sicherheit usw Unsere Sicherheit soll insgesamt und die sicherste sein.

Lassen Sie mich abschließend sagen, was oben ausgedrückt wurde: 1. Initialisieren Sie Ihre Variablen. 2. Filtern Sie unbedingt Ihre Variablen.

Vielen Dank fürs Lesen. Bitte achten Sie darauf, mehr verwandte PHP-Inhalte zu erhalten Chinesische Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn