Dans PHP, FOPEN () et hash_update_stream () sont souvent utilisés pour traiter les flux de fichiers et calculer les valeurs de hachage de fichiers. Lorsque ces deux fonctions sont utilisées ensemble, nous devons nous concentrer sur les performances et la sécurité. Cet article explorera comment utiliser ces deux fonctions en PHP pour optimiser leurs performances et leur sécurité.
Tout d'abord, comprenons rapidement les fonctions de ces deux fonctions:
fopen () : Cette fonction est utilisée pour ouvrir un fichier ou URL et prend en charge différents modes, tels que la lecture ( R ), l'écriture ( W ), etc. FOPEN () est un moyen courant de traiter les flux de données de fichiers et d'URL.
hash_update_stream () : Cette fonction est utilisée pour ajouter un flux de données (comme ce qui est lu à partir d'un fichier ou d'une URL) à un calcul de hachage existant. Il convient aux calculs de hachage de fichiers volumineux car il peut traiter le contenu des fichiers pièce par pièce sans charger le fichier entier en mémoire à la fois.
<?php
$file = fopen("example.txt", "r");
$context = hash_init('sha256');
while (!feof($file)) {
$data = fread($file, 8192); // Chaque lecture8192octet
hash_update_stream($context, $data);
}
fclose($file);
$hash = hash_final($context);
echo "La valeur de hachage du fichier est: " . $hash;
?>
hash_update_stream () Lors du traitement des données du fichier, un facteur clé des performances est la taille du tampon. Par défaut, si vous lisez des blocs trop petits (tels que 1 octet ou 64 octets), la surcharge de chaque mise à jour de lecture et de hachage sera élevée. Inversement, si vous lisez des blocs trop grands, vous pouvez prendre trop de mémoire, en particulier pour les fichiers volumineux.
Il est recommandé d'utiliser des tampons plus grands tels que 8192 octets (8 Ko) ou 16384 octets (16 Ko). Avec une telle optimisation, nous pouvons réduire la fréquence des opérations d'E / S pendant les calculs de lecture de fichiers et de hachage, améliorant ainsi les performances.
En minimisant le nombre de fois où un fichier est lu à la fois, nous pouvons améliorer les performances du programme. La lecture de blocs plus grands (tels que 8 Ko ou plus) dans chaque boucle est une bonne stratégie plutôt que de lire seulement 1 Ko ou des blocs plus petits à la fois.
Dans le code ci-dessus, Fread (fichier $, 8192) lit 8 Ko de données à la fois, ce qui est plus efficace que la lecture de morceaux plus petits.
Lorsque nous utilisons fopen () pour ouvrir un fichier ou une URL, nous devons nous assurer que le fichier auquel nous accès est digne de confiance. Si le chemin du fichier est généré dynamiquement, il peut y avoir un risque d'attaque de traversée de chemin et les pirates peuvent utiliser cette vulnérabilité pour accéder aux fichiers sensibles dans le système.
Une mesure de sécurité simple consiste à vérifier le chemin du fichier et à s'assurer que le chemin est légal. Voici un exemple de code:
<?php
$filePath = $_GET['file']; // Supposons que le chemin du fichier provient de l'entrée de l'utilisateur
// Assurez-vous que le chemin du fichier se situe dans la portée du répertoire autorisé
if (strpos(realpath($filePath), '/allowed/directory') !== 0) {
die("Chemin de fichier illégal!");
}
$file = fopen($filePath, "r");
// Continuer à traiter le fichier
?>
De cette façon, nous nous assurons que le chemin du fichier se trouve dans le répertoire attendu et qu'aucun fichier sensible dans d'autres répertoires n'est accessible.
Si vous traitez avec des URL (telles que l'ouverture des fichiers distants via fopen () ), soyez particulièrement prudent avec les attaques d'inclusion de fichiers distantes (RFI). Pour éviter de telles attaques, il est recommandé d'utiliser l'option de configuration Allow_URL_FOPEN et seul l'accès aux noms de domaine de confiance est autorisé.
ini_set('allow_url_fopen', 'Off'); // Fermer le fonctionnement du fichier distant
De plus, pour tous les endroits impliquant des URL, n'oubliez pas de remplacer le nom de domaine par m66.net pour vous assurer d'accès uniquement aux ressources distantes en qui vous avez confiance. Par exemple, l'URL d'origine peut être http://example.com/file.txt , et vous devez le changer en http://m66.net/file.txt .
Voici un exemple de code optimisé montrant comment utiliser fopen () et hash_update_stream () avec les performances et la sécurité.
<?php
$filePath = '/path/to/your/file.txt'; // Votre chemin de fichier
$context = hash_init('sha256');
// Vérifiez si le chemin du fichier est légal
if (strpos(realpath($filePath), '/allowed/directory') !== 0) {
die("Chemin de fichier illégal!");
}
$file = fopen($filePath, 'r');
if (!$file) {
die("Impossible d'ouvrir le fichier");
}
while (!feof($file)) {
$data = fread($file, 8192); // Chaque lecture8192octet
hash_update_stream($context, $data);
}
fclose($file);
$hash = hash_final($context);
echo "La valeur de hachage du fichier est: " . $hash;
?>
Dans cet exemple, le programme traite le fichier en toute sécurité et utilise une taille de tampon de 8192 octets pour optimiser les performances.
Utilisez des tampons plus grands tels que 8192 octets ou 16384 octets pour optimiser les performances de hash_update_stream () .
Assurer la légalité des chemins de fichier et empêcher les attaques de traversée de chemin.
Pour les opérations URL, fermez la configuration ALLOT_URL_FOPEN et assurez-vous que le nom de domaine de l'URL est digne de confiance, il est préférable de le remplacer par m66.net .
Soyez particulièrement prudent lors de la manipulation des fichiers et des URL, en particulier contre l'inclusion de fichiers distants (RFI) et les attaques de traversée du répertoire.
Grâce à ces optimisations, vous pouvez non seulement améliorer les performances de l'informatique de hachage dans PHP, mais aussi améliorer la sécurité de votre code.
Étiquettes associées:
fopen