|
|
|
| Допустим имеется скрипт который выводит содержимое файла в текстовом виде, сам файл должен загрузить через соответствующую форму пользователь.
Я всячески проверяю ИМЯ файла на валидность, но что если вредный юзер намеренно подменил расширение файла с .zip на разрешенное .txt ?
Таким образом он как бы меня обманул, и скрипт пытается прочитать ZIP архив как текстовый файл, что страшно нарушает гармонию скрипта и мое душевное спокойствие.
Вобщем это такая обобщенная ситуация, как в принципе можно проверять файл по его содержимому, а не по имени? | |
|
|
|
|
|
|
|
для: Gemorroj
(14.06.2007 в 23:04)
| | При закачке файла на сервер при помощи формы, можно проверить его тип не по расширению, а по MIME:
if ($_FILES['File']['type'] != 'zip') echo 'файл не архивный';
|
Вот только не знаю можно ли юзеру потделать MIME-тип | |
|
|
|
|
|
|
|
|
для: Trianon
(15.06.2007 в 01:28)
| | Спасибо =) | |
|
|
|
|
|
|
|
для: Gemorroj
(15.06.2007 в 10:05)
| | вобщем я натужился и выдал это
function str($tempnam)
{
$fl = trim(file_get_contents($tempnam));
$i = 0;
$len = strlen($fl);
do
{
if((ord($fl[$i]) >= 32 && ord($fl[$i]) <= 255) || (ord($fl[$i]) == 10) || (ord($fl[$i]) == 13))
{
$arr.= $fl[$i];
}
}
while(++$i <= $len);
$tempnam = fopen($tempnam,'w+');
fputs($tempnam,$arr);
fclose($tempnam);
}
|
Где $tempnam это имя уже загруженного файла | |
|
|
|
|
|
|
|
для: Gemorroj
(15.06.2007 в 14:27)
| | жутко медленный код будет. | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2007 в 14:35)
| | Да, действительно, файл в 100 кб обрабатывается примерно 0.5 сек.
Надо посильнее натужиться =) | |
|
|
|
|
|
|
|
для: Gemorroj
(15.06.2007 в 15:07)
| | лучше примените count_chars() | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2007 в 15:53)
| | Я б применил если б знал как.
Что-то никак придумать не могу.
Я получаю массив, из символов и количества вхождений их в подстроку, но как эти символы расставить по своим местам? | |
|
|
|
|
|
|
|
для: Gemorroj
(15.06.2007 в 19:10)
| | не надо их никуда расставлять.
Если там (в режиме 1) появились символы с левыми кодами - значит маловероятно, что это текст.
Пробежаться по короткому массиву результата этой функции - куда быстрее, чем бежать по всему файлу.
Сделать это можно циклом
<?
$alpha=count_chars(" !\"#$....0123...ABCD...abcd...АБВГ.... абвг....",1);
foreach(count_chars($txt, 1) as $key => $val)
if(!isset($alpha[$key]))
{$bad = 1; break}
|
| |
|
|
|
|
|
|
|
для: Trianon
(15.06.2007 в 19:14)
| | Спасибо | |
|
|
|
|
|
|
|
для: Gemorroj
(15.06.2007 в 20:17)
| | Еще можно сделать так, если OS Linux и Perl установлен в "/usr/bin/perl":
<?php
$filename = "screenshot.jpg";
if(exec("/usr/bin/perl -e \"unless(-T '" . $filename . "') { print('binary'); } else { print('txt'); }\"") == "binary")
{
echo("Файл " . $filename . " является бинарным.");
}
?>
|
| |
|
|
|