Während ich dieses Buch schreibe, listet //m.sbmmt.com/ insgesamt 3917 Funktionen auf, einschließlich einiger funktionsähnlicher Syntaxstrukturen. Ich werde sie hier nicht von Funktionen unterscheiden, sondern sie als Funktion behandeln.
Aufgrund der Vielzahl der Funktionen ist es unmöglich, deren korrekte und sichere Verwendung einzeln zu erklären. Hier habe ich die Funktionen ausgewählt, die meiner Meinung nach die meiste Aufmerksamkeit erfordern. Zu den Auswahlkriterien gehören die Häufigkeit der Nutzung, der Grad der Gefährdung (Sicherheit) bei der Nutzung und meine eigene Erfahrung.
Für jede aufgeführte Funktion gebe ich eine empfohlene Verwendung. Wenn ich diese Methoden vorschlage, werde ich der Sicherheit Priorität einräumen. Bitte passen Sie es während des tatsächlichen Gebrauchs entsprechend Ihren Bedürfnissen an.
Wenn eine Funktion das gleiche Risiko aufweist wie eine andere, werde ich Informationen geben, die sich auf die andere Funktion beziehen, anstatt sie noch einmal redundant zu beschreiben.
B.1. eval( )
Die Funktion eval( ) wird verwendet to Eine Zeichenfolge wird analysiert und als PHP-Anweisung ausgeführt. Zum Beispiel:
<?php $name = 'Chris'; $string = 'echo "Hello, $name";'; eval($string); ?>
Im obigen Beispiel: $ string fungiert als PHP-Anweisung und entspricht daher:
<?php $name = 'Chris'; echo "Hello, $name"; ?>
Obwohl eval( ) ist sehr nützlich, kann aber sehr gefährlich sein, wenn manipulierte Daten verwendet werden. Wenn beispielsweise im folgenden Beispiel $name fehlerhaft ist, kann ein Angreifer beliebigen PHP-Code ausführen:
<?php $name = $_GET['name']; eval($name); ?>
Ich empfehle Ihnen, die Verwendung von eval() zu vermeiden, wenn Sie nicht sicher sind, ob die in PHP interpretierte Zeichenfolge fehlerhafte Daten verwendet, und wenn möglich. Diese Funktion sollte bei Sicherheitsüberprüfungen und Peer-Reviews hervorgehoben werden.
B.2 exec( )
Wie in Kapitel 6 erwähnt, ist die Ausführung von Shell-Befehlen ein sehr gefährlicher Vorgang. Die Verwendung kontaminierter Daten beim Erstellen von Shell-Befehlen kann zu Sicherheitslücken bei der Befehlsinjektion führen.
Vermeiden Sie die Verwendung von Shell-Befehlsfunktionen. Wenn Sie sie jedoch verwenden müssen, stellen Sie sicher, dass Sie beim Erstellen des Shell-Befehls nur gefilterte und maskierte Daten verwenden.
<?php $clean = array(); $shell = array(); /* Filter Input ($command, $argument) */ $shell['command'] = escapeshellcmd($clean['command']); $shell['argument'] = escapeshellarg($clean['argument']); $last = exec("{$shell['command']} {$shell['argument']}", $output, $return); ?>
B.3. Datei( )
Datei( )-Funktion ist eine meiner Lieblingsmethoden zum Lesen von Dateien. Es liest jede Zeile der Datei als Element des zurückgegebenen Arrays. Besonders praktisch ist, dass Sie kein Datei-Handle angeben müssen – Sie geben den Dateinamen an und es erledigt alles für Sie:
<?php $contents = file('/tmp/file.txt'); print_r($contents); ?>
Wenn die obige Datei zwei Zeilen enthält, wird eine Ausgabe ähnlich der folgenden erzeugt:
Array ( [0] => This is line one. [1] => This is line two. )
Datei verwenden( )-Funktion ist nicht besonders gefährlich, aber wenn sie mit aktivierter Option „allow_url_fopen“ verwendet wird, kann sie viele verschiedene Arten von Ressourcen lesen, wie zum Beispiel den Inhalt einer Remote-Website:
<?php $contents = file('http://example.org/'); print_r($contents); ?>
Die Ausgabe ist wie folgt (gekürzt):
Array ( [0] => <html> [1] => <head> [2] => <title>Example Web Page</title> [3] => </head> [4] => <body> ... [11] => </body> [12] => </html> )
Wenn ein von der Funktion file() aufgerufener Dateiname aus fehlerhaften Daten erstellt wird, sollte auch sein Inhalt als fehlerhaft betrachtet werden. Dies liegt daran, dass die Verwendung fehlerhafter Daten zur Erstellung von Dateinamen dazu führen kann, dass Sie eine Remote-Website mit schädlichen Daten öffnen. Sobald Sie Daten in einer Variablen speichern, steigt die Gefahr dramatisch:
<?php $tainted = file($_POST['filename']); ?>
$tainted数组中的每个元素与$_POST['filename']有相同的危险性——它是输入并必须要进行过滤。
在这里,其行为有可能是意想不到的——$_POST['filename']的误用可以改变file()函数的行为,因此它可以指向一个远程资源而不是本地文件。
B.4. file_get_contents( )
参见 "file( )."
B.5. fopen( )
参见 "file( )."
B.6. include
如第5章所述,include在组织化与模块化的软件设计中被普遍使用,是非常有必要的。但是,不正确的使用include会造成一个重大的代码注入安全漏洞。
在include语句中只使用已过滤数据是非常有必要的。在安全审查和同行评审中,应重点检查该函数。
B.7. passthru( )
见"exec( )."
B.8. phpinfo( )
phpinfo( )会输出有关PHP信息的页面——运行的版本号,配置信息等等。由于phpinfo( )的输出提供了非常多的信息,我建议限制对任何使用该函数的资源的访问。
如果你使用的第八章中的技巧来保护数据库验证信息,则需要确认访问者不能看到由phpinfo( )形成的输出信息,这是由于它会暴露超级全局数组$_SERVER的内容。
B.9. popen( )
参见"exec( )."
B.10. preg_replace( )
preg_replace( )用于对符合正则表达式的字符串进行替换。在某些情况下,使用被污染数据构造正则表达式部分会非常危险,因为它的e修饰符会导致在替换时把用于替换的参数作为PHP代码来对待。例如(本例为译者所加):
<?php $str = "abcdef"; $se = "len"; $reg = "/abc/e"; echo preg_replace($reg,"strlen(\$se)",$str); ?>
会输出如下字串:
3def
当使用了e修饰符,不管是否有意为之,它会带来与eval()相同的风险。在安全审查和同行评审中,应重点检查该函数。
B.11. proc_open( )
参见 "exec( )."
B.12. readfile( )
参见 "file( )."
B.13. require
参见 "include."
B.14. shell_exec( )
参见 "exec( )."
B.15. system( )
参见 "exec( )."
以上就是PHP安全-函数的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!