Maison > Article > développement back-end > Fonction de sécurité PHP
Au moment où j'écris ce livre, http://www.php.cn/ répertorie un total de 3917 fonctions, y compris certaines structures syntaxiques similaires aux fonctions. Je ne vais pas les distinguer des fonctions ici, mais les traiter comme une fonction.
En raison du grand nombre de fonctions, il est impossible d’expliquer une par une leur utilisation correcte et sûre. Ici, j'ai sélectionné les fonctions qui, selon moi, nécessitent le plus d'attention. Les critères de sélection incluent la fréquence d'utilisation, le degré de danger (sécurité) lors de l'utilisation et ma propre expérience.
Pour chaque fonction répertoriée, je propose une utilisation recommandée. Je garderai la sécurité comme priorité lorsque je proposerai ces méthodes. Veuillez ajuster en conséquence en fonction de vos besoins lors de l'utilisation réelle.
Lorsqu'une fonction présente le même risque qu'une autre, je donnerai des informations faisant référence à l'autre fonction au lieu de la décrire à nouveau de manière redondante.
B.1. eval( )
La fonction eval( ) est utilisée to Une chaîne est analysée et exécutée comme une instruction PHP. Par exemple :
<?php $name = 'Chris'; $string = 'echo "Hello, $name";'; eval($string); ?>
Dans l'exemple ci-dessus, $ string fonctionne comme une instruction PHP, elle est donc équivalente à :
<?php $name = 'Chris'; echo "Hello, $name"; ?>
Bien que eval( ) est très utile, mais peut être très dangereux lorsque des données corrompues sont utilisées. Par exemple, dans l'exemple suivant, si $name est corrompu, un attaquant peut exécuter du code PHP arbitraire :
<?php $name = $_GET['name']; eval($name); ?>
Je vous recommande d'éviter d'utiliser eval() lorsque vous n'êtes pas sûr que la chaîne interprétée en PHP utilise des données corrompues, et lorsque cela est possible. Cette fonction doit être mise en avant lors des revues de sécurité et des revues par les pairs.
B.2. exec( )
Comme mentionné au chapitre 6, l'exécution de commandes shell est une opération très dangereuse. L'utilisation de données contaminées lors de la construction de commandes shell peut conduire à des vulnérabilités d'injection de commandes.
Essayez d'éviter d'utiliser les fonctions de commande shell, mais lorsque vous en avez besoin, veillez à n'utiliser que des données filtrées et échappées lors de la construction de la commande shell.
<?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. fichier( )
fichier( ) est l’une de mes façons préférées de lire des fichiers. Il lit chaque ligne du fichier comme un élément du tableau renvoyé. Ce qui est particulièrement pratique, c'est que vous n'avez pas besoin de fournir un identifiant de fichier - vous fournissez le nom du fichier et il fait tout pour vous :
<?php $contents = file('/tmp/file.txt'); print_r($contents); ?>
Si le fichier ci-dessus comporte deux lignes, il produira un résultat similaire à celui-ci :
Array ( [0] => This is line one. [1] => This is line two. )
Utiliser le fichier( ) la fonction n'est pas particulièrement dangereuse, mais lorsqu'elle est utilisée avec l'option allow_url_fopen activée, elle peut lire de nombreux types de ressources différents tels que le contenu d'un site Web distant :
<?php $contents = file('http://example.org/'); print_r($contents); ?>
Le résultat est le suivant (abrégé) :
Array ( [0] => <html> [1] => <head> [2] => <title>Example Web Page</title> [3] => </head> [4] => <body> ... [11] => </body> [12] => </html> )
Si un nom de fichier appelé par la fonction file() est construit à partir de données corrompues, son contenu doit également être considéré comme corrompu. En effet, l'utilisation de données corrompues pour créer des noms de fichiers peut vous amener à ouvrir un site Web distant contenant des données malveillantes. Une fois que vous enregistrez des données dans une variable, le danger augmente considérablement :
<?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中文网(www.php.cn)!