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

Форум PHP

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

 

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

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

тема: Работа с файлами
 
 автор: Kirill   (23.08.2004 в 13:29)   письмо автору
 
 

Возможно-ли записать строку в середину файла?
При этом изменить только 1 строку(ту, что в середние).
Т.е. удалить старую и записать новую.

   
 
 автор: glsv (Дизайнер)   (23.08.2004 в 14:46)   письмо автору
 
   для: Kirill   (23.08.2004 в 13:29)
 

Можно, но с несколькими дополнительными действиями.

1. Считываем файл в массив
2. Заменяем нужный элемент массива (строку)
3. Записываем массив в файл


<?
  $file 
fopen ("test.txt","r+");
  if (
$file)
  {
    
// Считываем содержимое в массив, разбиение происходит по строкам
    
$file_array file("test.txt");  
    
// заменяем строку, например 3-ую
    
$file_array[2]="qqqqqqqqqqqqq\r\n"
    
// Записываем массив обратно в файл
    
foreach ($file_array as $value)
    {
      
fwrite ($file$value);
    }
    
fclose $file);
  }
  else
  {
    echo(
"Ошибка открытия файла");
  }
?>


http://www.softtime.ru/bookphp/gl6_1.php

   
 
 автор: cheops   (23.08.2004 в 23:28)   письмо автору
 
   для: glsv (Дизайнер)   (23.08.2004 в 14:46)
 

Вот ещё тема со сходной задачей...

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=141&page=3

   
 
 автор: Kirill   (24.08.2004 в 19:17)   письмо автору
 
   для: cheops   (23.08.2004 в 23:28)
 

Еще одна проблемка:
Скрипт выводит ссылку на файл пользователя, если файл
HTML, php etc, то при нажатии на ссылку он открывается в браузере, а не закачивается на клиентскую машину.
Как лечить? :/

   
 
 автор: cheops   (24.08.2004 в 20:04)   письмо автору
 
   для: Kirill   (24.08.2004 в 19:17)
 

Дизайнер утверждает что как-то можно... У меня (и не только у меня) была такая проблема с FTP-менеджером. Мне кажется что здесь бесполезно что-то делать, так как это делает браузер - это его задача интерпретировать тип файла и предоставлять соответствующий вывод. Ну если только нет какого-нибудь хитрого HTTP заголовка, под каждый конкретный браузер - стандартного заголовка, заставляющего браузер сохранять переданный ему файл в текущей версии HTTP нет точно.

   
 
 автор: glsv (Дизайнер)   (24.08.2004 в 23:09)   письмо автору
 
   для: Kirill   (24.08.2004 в 19:17)
 

>файл HTML, php etc, то при нажатии на ссылку он открывается в браузере

Но ведь так и должно быть... ?

   
 
 автор: Kirill   (24.08.2004 в 23:15)   письмо автору
 
   для: glsv (Дизайнер)   (24.08.2004 в 23:09)
 

как бы сказать =)
Ведь ссылка на фаил ничем не отличается от обычной страницы
Так можно и вредоносную страничку на сервер залить, а потом запустить.
Как с этим бороться?

   
 
 автор: cheops   (24.08.2004 в 23:37)   письмо автору
 
   для: Kirill   (24.08.2004 в 23:15)
 

Да, таким образом можно создать шикарную дыру на сайте. Мы не нашли ничего лучшего как переименовать все потенциально опасные расширения (*.php, *.pl, *.html и т.п.) в *.txt.

PS В следующей версии LiteForum нужно будет сделать панель в системе администрирования, в которой можно будет разрешать файлы лишь с определёнными расширениями.

   
 
 автор: Kirill   (24.08.2004 в 23:47)   письмо автору
 
   для: cheops   (24.08.2004 в 23:37)
 

+ ИМХО непло было бы сделать возможность поиска по имени автора

   
 
 автор: cheops   (25.08.2004 в 00:52)   письмо автору
 
   для: Kirill   (24.08.2004 в 23:47)
 

А она имеется... как в поиске по сообщениям, так и в поиске по темам...

   
 
 автор: glsv (Дизайнер)   (25.08.2004 в 00:26)   письмо автору
 
   для: Kirill   (24.08.2004 в 23:15)
 

Ах вот вы о чем.
....
Я тут поэкспериментировал. Попробуйте вот это код.

$filename содержит имя файла с расширением php или html

<?php 
$filename 
"index.html"
$fd fopen($filename"r"); 
if (!
$fd){ 
  
header ("HTTP/1.0 403 Forbidden"); 
  exit; 

$content fread($fdfilesize($filename)); 
fclose($fd); 
header("Content-Disposition: attachment; filename=$filename"); 
header("Content-type: application/octet-stream"); 
print 
$content
exit; 
?> 


PS: Хотя может мы говорим про разные вещи. Тот скрипт, что я привел позволяет скачивать (не открывать автоматически в браузере) файлы с расширениями php и html. Т.е. появляется окно с вопросом: скачать или открыть.

   
 
 автор: cheops   (25.08.2004 в 00:56)   письмо автору
 
   для: glsv (Дизайнер)   (25.08.2004 в 00:26)
 

Хм... классно, а я как раз поток и не пробовал :) Нужно будет FTP-менеджер поправить...

   
 
 автор: Kirill   (25.08.2004 в 11:06)   письмо автору
 
   для: glsv (Дизайнер)   (25.08.2004 в 00:26)
 

А как его использовать?
У меня есть ссылка на фаил...
Надо весь этот скрипт функцией сделать и передавать ей имя при клике на ссылку?

   
 
 автор: cheops   (25.08.2004 в 11:18)   письмо автору
 
   для: Kirill   (25.08.2004 в 11:06)
 

Лучше даже не функцией, а отдельным файлом:
<?php
// Это файл get.php
$filename $_GET['filename']; 
$fd fopen($filename"r"); 
if (!
$fd){ 
  
header ("HTTP/1.0 403 Forbidden"); 
  exit; 

$content fread($fdfilesize($filename)); 
fclose($fd); 
header("Content-Disposition: attachment; filename=$filename"); 
header("Content-type: application/octet-stream"); 
print 
$content
exit; 
?>

Тогда загрузка файла будет осуществляться при обращении по ссылке get.php?filename=index.php. Только, следует проверять, что посетители тащат с вашего сайта, иначе, воспользовавшись таким скриптом, они все коды сайта упрут, подставляя соответствующие названия в URL. Обычно заводят массив в котором регистрируют имя файла, предназначенного для загрузки, и перед передачей файла - проверяют, входит ли его имя в этот массив.

   
 
 автор: Kirill   (25.08.2004 в 11:27)   письмо автору
 
   для: cheops   (25.08.2004 в 11:18)
 

Может быть вы объясните мне как создать такой "долго живущий массив". Чтобы не выбирать каждый раз и БД имена всех файлов, а заносить их в него сразу при загрузке.

ЗЫ
Я так и не нашел возможности поиска по имени создателя темы.

   
 
 автор: cheops   (25.08.2004 в 12:29)   письмо автору
 
   для: Kirill   (25.08.2004 в 11:27)
 

Всё зависит от количества файлов, если у вас их немного, то можно просто в файле get.php явно его каждый раз конструировать:
<?php
  $names
[] = "archive.zip"
  
$names[] = "index.html"
  
.........................................
  
$names[] = "poll.php"
?>

Можно так же хранить имена в файле и каждый раз читать его и преобразовывать в массив
<?php
  $file 
fopen("auth""r");
  
$buffer fread($filefilesize("auth"));
  
fclose($file);
  
// Разбиваем строку на имена файлов,
  // которые помещаем в массив $names
  
$names explode("\r\n",$buffer)
?>


PS Странно, зашёл в поиск скопировал в строку запроса ваше имя: на этом форуме вы инициировали 7 тем:
mail() Под WIndows
Работа с файлами
Работа с временем
Шифрование
MySQL количество баз данных.
__clone()
Call to undefined function mcrypt_create_iv())
Сообщения оставлены вами в 11 темах.

http://www.softtime.ru/dic/id_dic=21&id_group=1

   
 
 автор: Kirill   (25.08.2004 в 14:07)   письмо автору
 
   для: cheops   (25.08.2004 в 12:29)
 

Продолжая развивать тему безопастности, связанную с возможностью пользователей сохранять свои файлы на сервере,
Хочется спросить: А как ограничить доступ к папке
files. Т.е. разрешить доступ к ней только через функцию get.
А то. ведь можно на прямую выполнить файлик с враждебным скриптом, подсунутый через атачь.

+ При выполнении следующей функции браузер предлагает сохранить фаил с названием "get"
Ссылка следующая:
http://localhost/CTS/get.php?filename=files/9-20040825140334[.php].att
<?php
      $file_name 
$_GET['filename'];
      
$fd fopen($file_name"r");
      if (!
$fd)
      {
         
header ("HTTP/1.0 403 Forbidden");
         exit;
      }
      
$content fread($fdfilesize($file_name));
      
fclose($fd);
      
$query "SELECT file FROM posts WHERE file = '".$file_name."';";
      
$files mysql_query($query);
      if(
$files)
      {
         
$file mysql_fetch_array($files);
         if(
$file['file'] == "")
         {
            
header ("HTTP/1.0 403 Forbidden");
            exit;
         }
      }
      else
          
PutError("Error");

      
header("Content-Disposition: attachment; filename=".$file_name);
      
header("Content-type: application/octet-stream");
      print 
$content;
      exit;
?>

   
 
 автор: glsv (Дизайнер)   (25.08.2004 в 14:53)   письмо автору
 
   для: Kirill   (25.08.2004 в 14:07)
 

>А как ограничить доступ к папке files.
Чтобы из браузера нельзя было получить доступ к этой папке
в нее нужно поместить файл .htaccess с опцией:

deny from all

.... Ну можно еще прямо в файле get.php проверять из какого скрипта произошел вызов и тогда разрешать или запрешать выполнение.

>+ При выполнении следующей функции браузер предлагает сохранить фаил с названием "get"
В смысле? Сохраняет все файлы под именем get? Странно... У меня сохраняет нормально - под именем файла.

   
 
 автор: Kirill   (25.08.2004 в 15:27)   письмо автору
 
   для: glsv (Дизайнер)   (25.08.2004 в 14:53)
 

Спсибо разобрался...
Не подскажите где можно прочитать про .htaccess ?

   
 
 автор: glsv (Дизайнер)   (01.09.2004 в 23:00)   письмо автору
 
   для: Kirill   (25.08.2004 в 15:27)
 

Теперь можно почитать в статье по ссылке :) В ней далеко не всё, но публикации будут продолжаться.

http://www.softtime.ru/info/articlephp.php?id_article=25

   
Rambler's Top100
вверх

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