Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подмена расширения файла
 
 автор: Gemorroj   (14.06.2007 в 23:04)   письмо автору
 
 

Допустим имеется скрипт который выводит содержимое файла в текстовом виде, сам файл должен загрузить через соответствующую форму пользователь.
Я всячески проверяю ИМЯ файла на валидность, но что если вредный юзер намеренно подменил расширение файла с .zip на разрешенное .txt ?
Таким образом он как бы меня обманул, и скрипт пытается прочитать ZIP архив как текстовый файл, что страшно нарушает гармонию скрипта и мое душевное спокойствие.

Вобщем это такая обобщенная ситуация, как в принципе можно проверять файл по его содержимому, а не по имени?

   
 
 автор: Yuriev   (15.06.2007 в 01:27)   письмо автору
 
   для: Gemorroj   (14.06.2007 в 23:04)
 

При закачке файла на сервер при помощи формы, можно проверить его тип не по расширению, а по MIME:
if ($_FILES['File']['type'] != 'zip') echo 'файл не архивный';

Вот только не знаю можно ли юзеру потделать MIME-тип

   
 
 автор: Trianon   (15.06.2007 в 01:28)   письмо автору
 
   для: Gemorroj   (14.06.2007 в 23:04)
 

count_chars()

   
 
 автор: Gemorroj   (15.06.2007 в 10:05)   письмо автору
 
   для: Trianon   (15.06.2007 в 01:28)
 

Спасибо =)

   
 
 автор: Gemorroj   (15.06.2007 в 14:27)   письмо автору
 
   для: 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 это имя уже загруженного файла

   
 
 автор: Trianon   (15.06.2007 в 14:35)   письмо автору
 
   для: Gemorroj   (15.06.2007 в 14:27)
 

жутко медленный код будет.

   
 
 автор: Gemorroj   (15.06.2007 в 15:07)   письмо автору
 
   для: Trianon   (15.06.2007 в 14:35)
 

Да, действительно, файл в 100 кб обрабатывается примерно 0.5 сек.

Надо посильнее натужиться =)

   
 
 автор: Trianon   (15.06.2007 в 15:53)   письмо автору
 
   для: Gemorroj   (15.06.2007 в 15:07)
 

лучше примените count_chars()

   
 
 автор: Gemorroj   (15.06.2007 в 19:10)   письмо автору
 
   для: Trianon   (15.06.2007 в 15:53)
 

Я б применил если б знал как.
Что-то никак придумать не могу.
Я получаю массив, из символов и количества вхождений их в подстроку, но как эти символы расставить по своим местам?

   
 
 автор: Trianon   (15.06.2007 в 19:14)   письмо автору
 
   для: Gemorroj   (15.06.2007 в 19:10)
 

не надо их никуда расставлять.
Если там (в режиме 1) появились символы с левыми кодами - значит маловероятно, что это текст.
Пробежаться по короткому массиву результата этой функции - куда быстрее, чем бежать по всему файлу.
Сделать это можно циклом
<?
$alpha
=count_chars(" !\"#$....0123...ABCD...abcd...АБВГ.... абвг....",1);
foreach(
count_chars($txt1) as $key => $val
  if(!isset(
$alpha[$key])) 
    {
$bad 1; break}

   
 
 автор: Gemorroj   (15.06.2007 в 20:17)   письмо автору
 
   для: Trianon   (15.06.2007 в 19:14)
 

Спасибо

   
 
 автор: Unkind   (15.06.2007 в 20:26)   письмо автору
 
   для: 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 " является бинарным.");
}
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования