На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Поиск zip-бомб
    Мне над написать прогу по поиску в директории zip-бомб.
    Вопрос в том, каким способом мне определить что эт бомба а не обычный архив?
    И ещё, как реализовать отправку инфы по почте?
      Пожалуйста, впредь в одной теме задавайте один вопрос.

      Цитата Geptor @
      Мне над написать прогу по поиску в директории zip-бомб.

      Можно просветить местную темноту (меня в том числе), что есть zip-бомба и какое отношение это имеет к java?
        Наверное, это. Есть сильное желание двинуть топик в security.
          Цитата Geptor @
          Вопрос в том, каким способом мне определить что эт бомба а не обычный архив?

          я бы начал распаковку и смотрел бы во сколько раз уже распакованные данные больше самого архива. :)
          Цитата Geptor @
          И ещё, как реализовать отправку инфы по почте?

          http://java.sun.com/products/javamail/
            Цитата Konigsberg @
            я бы начал распаковку и смотрел бы во сколько раз уже распакованные данные больше самого архива.

            Судя по описанию в википедии и прилагаемому примеру, достаточно вытащить информацию о файлах из архива, не распаковывая.
              Цитата wind @
              Судя по описанию в википедии и прилагаемому примеру, достаточно вытащить информацию о файлах из архива, не распаковывая.

              ну я читал не особо внимательно, хотя следить за размером распакованных данных не помешает, если архив попытается "обмануть" на счет размера данных :)
                Извиняюсь за свою неопытность по созданию тем.
                Вот и подошли к тому вопросу который меня интересовал. Какими методами можно получить инфу об архиве?
                  java.util.zip.ZipEntry
                  public long getSize() - Returns the uncompressed size of the entry data, or -1 if not known.
                    Вот нашел пример проги работающей с zip-ами. Ток в коде отмечены 4 ошибки. Мне не понятно в чём дело. Помогите исправить.
                    Вот код:
                    ExpandedWrap disabled
                      import javax.swing.*;
                      import javax.swing.filechooser.*;
                      import java.awt.event.ActionEvent;
                      import java.awt.event.ActionListener;
                      import java.awt.*;
                      import java.io.*;
                      import java.io.FileFilter;
                      import java.util.zip.ZipInputStream;
                      import java.util.zip.ZipEntry;
                      import java.util.ArrayList;
                       
                      /**
                       * Created by IntelliJ IDEA.
                       * User: Witcher
                       * Date: 06.11.2007
                       * Time: 20:37:42
                       * To change this template use File | Settings | File Templates.
                       */
                      public class ZipTest
                      {
                          public static void main(String[] args)
                          {
                              ZipTestFrame frame = new ZipTestFrame();
                              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                              frame.setVisible(true);
                          }
                      }
                       
                      class ZipTestFrame extends JFrame
                      {
                          public ZipTestFrame()
                          {
                              setTitle("ZipTest");
                              setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
                       
                              JMenuBar menuBar = new JMenuBar();
                              JMenu menu = new JMenu("File");
                       
                              JMenuItem openItem = new JMenuItem("Open");
                              menu.add(openItem);
                              openItem.addActionListener(new OpenAction());
                       
                              JMenuItem exitItem = new JMenuItem("Exit");
                              menu.add(exitItem);
                              exitItem.addActionListener(new ActionListener() {
                                  public void actionPerformed(ActionEvent event) {
                                      System.exit(0);
                                  }
                              });
                       
                              menuBar.add(menu);
                              setJMenuBar(menuBar);
                       
                              fileText = new JTextArea();
                              fileCombo = new JComboBox();
                              fileCombo.addActionListener(new ActionListener() {
                                  public void actionPerformed(ActionEvent event) {
                                      loadZipFile((String) fileCombo.getSelectedItem());
                                  }
                              });
                       
                             add(fileCombo, BorderLayout.SOUTH);
                             add(new JScrollPane(fileText), BorderLayout.CENTER);
                      }
                       
                      private class OpenAction implements ActionListener {
                          public void actionPerformed(ActionEvent event)
                          {
                              JFileChooser chooser = new JFileChooser();
                              chooser.setCurrentDirectory(new File("."));
                              ExtensionFileFilter filter = new ExtensionFileFilter();
                              filter.addExtension(".zip");
                              filter.addExtension(".jar");
                              filter.setDescription("ZIP archives");
                              chooser.setFileFilter(filter);
                              int r = chooser.showOpenDialog(ZipTestFrame.this);
                              if (r == JFileChooser.APPROVE_OPTION) {
                                  zipname = chooser.getSelectedFile().getPath();
                                  scanZipFile();
                              }
                          }
                      }
                       
                          public void scanZipFile()
                          {
                              fileCombo.removeAllItems();
                              try {
                                  ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
                                  ZipEntry entry;
                                  while ((entry = zin.getNextEntry()) != null) {
                                      fileCombo.addItem(entry.getName());
                                      zin.closeEntry();
                                  }
                                  zin.close();
                              }
                              catch (IOException e) {
                                  e.printStackTrace();
                              }
                          }
                       
                          public void loadZipFile(String name)
                          {
                              try {
                                  ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
                                  ZipEntry entry;
                                  fileText.setText("");
                       
                                  while ((entry = zin.getNextEntry()) != null) {
                                      if (entry.getName().equals(name)) {
                       
                                          BufferedReader in = new BufferedReader(new InputStreamReader(zin));
                                          String line;
                                          while ((line = in.readLine()) != null) {
                                              fileText.append(line);
                                              fileText.append("\n");
                                          }
                                      }
                                      zin.closeEntry();
                                  }
                                  zin.close();
                              }
                              catch (IOException e) {
                                  e.printStackTrace();
                              }
                          }
                       
                          public static final int DEFAULT_WIDTH = 400;
                          public static final int DEFAULT_HEIGHT = 300;
                       
                          private JComboBox fileCombo;
                          private JTextArea fileText;
                          private String zipname;
                      }
                       
                      class ExtensionFileFilter extends FileFilter {
                         /**
                            Adds an extension that this file filter recognizes.
                            @param extension a file extension (such as ".txt" or "txt")
                         */
                       
                         public void addExtension(String extension) {
                             if (!extension.startsWith("."))
                                 extension = "." + extension;
                             extensions.add(extension.toLowerCase());
                          }
                       
                         /**
                            Sets a description for the file set that this file filter
                            recognizes.
                            @param aDescription a description for the file set
                         */
                       
                         public void setDescription(String aDescription) {
                             description = aDescription;
                          }
                       
                         /**
                            Returns a description for the file set that this file
                            filter recognizes.
                            @return a description for the file set
                         */
                       
                         public String getDescription() {
                             return description;
                         }
                       
                         public boolean accept(File f) {
                              if (f.isDirectory()) return true;
                              String name = f.getName().toLowerCase();
                       
                              for (String e : extensions)
                                  if (name.endsWith(e))
                                      return true;
                              return false;
                          }
                       
                         private String description = "";
                         private ArrayList<String> extensions = new ArrayList<String>();
                      }
                      Выискивать ошибки лень, попробуйте сами. Вот вам пример: Простой ZIP-архиватор
                        Geptor, всё очень просто - ты напутал с импортами. Вместо нужного тебе класса javax.swing.filechooser.FileFilter ты импортировал java.io.FileFilter.
                          Как работать с одним zip архивом я разобрался. А вот как работать с архивами в архиве я не понима. во всех доках пишется только про один архив(без вложенных). я конечно пытался сам разобраться но хорошего из этого мало вышло.
                          Суть дела такова, есть файл последовательно заархивированный: b1.zip -> b2.zip -> b3.zip -> b4.zip -> t.txt. Мне над добраться до текстового файла. Сам файл читать не надо и разархивировать zip тоже, надо только получать инфу о каждом zip-е (ZipEntry). Код писать в метод scanZipFile.
                          ExpandedWrap disabled
                            import javax.swing.*;
                            import java.awt.*;
                            import java.awt.event.ActionListener;
                            import java.awt.event.ActionEvent;
                            import java.io.*;
                            import java.util.ArrayList;
                            import java.util.Enumeration;
                            import java.util.zip.ZipInputStream;
                            import java.util.zip.ZipEntry;
                            import java.util.zip.ZipFile;
                            import javax.swing.filechooser.FileFilter;
                             
                             
                            /**
                             * Created by IntelliJ IDEA.
                             * User: Witcher
                             * Date: 04.11.2007
                             * Time: 14:50:57
                             * To change this template use File | Settings | File Templates.
                             */
                             
                            public class ZipBomb {
                                public static void main(String arg[]) {
                                    final SearchZipBomb frame = new SearchZipBomb("SearchZipBomb");
                                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                    frame.setVisible(true);
                                    frame.setResizable(false);
                                }
                             }
                             
                            class SearchZipBomb extends JFrame{
                                private JPanel panel = new JPanel(new BorderLayout());
                                private TextArea listZipBomb = new TextArea("",5, 10, JScrollBar.VERTICAL);
                                private TextField directory = new TextField(10),
                                            email = new TextField(10);
                                private JButton review = new JButton("Обзор"),
                                        start = new JButton("Старт "),
                                        sendMail = new JButton("Отправить");
                                private JList listBomb = new JList();
                                private FileDialog file;
                                private String rootZip = new String();
                                private String scanDir = new String();
                             
                                SearchZipBomb(String titl) {
                                    setTitle(titl);
                                    setSize(450, 170);
                                    GridBagLayout layout = new GridBagLayout();
                                    String[] ds = {"aaa", "bbb"};
                                    listBomb.setListData(ds);
                                    setLayout(layout);
                                    viewInterface();
                                    setHandlerEvents();
                                }
                             
                                void viewInterface() {
                                    JLabel dir = new JLabel("Дериктория");
                                    JLabel mail = new JLabel("E-mail");
                                    listZipBomb.setBackground(Color.WHITE);
                                    listZipBomb.setEditable(false);
                                    listZipBomb.setVisible(true);
                                    directory.setBackground(Color.WHITE);
                                    directory.setEditable(false);
                                    add(listZipBomb, new GBC(0, 0, 1, 5).setFill(GBC.BOTH).setWeight(250, 0).setInsets(8));
                                    add(dir, new GBC(1, 0).setAnchor(GBC.WEST).setInsets(8, 0, 0, 0));
                                    add(directory, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(250, 0).setInsets(2));
                                    add(review, new GBC(2, 1).setFill(GBC.HORIZONTAL).setInsets(0, 2, 0, 8));
                                    add(start, new GBC(2, 2).setFill(GBC.HORIZONTAL).setInsets(5, 2, 0, 8));
                                    add(mail, new GBC(1, 3).setAnchor(GBC.WEST));
                                    add(email, new GBC(1, 4).setFill(GBC.HORIZONTAL).setWeight(250, 0).setInsets(0, 2, 8, 2));
                                    add(sendMail, new GBC(2, 4).setFill(GBC.HORIZONTAL).setInsets(0, 2, 8, 8));
                                }
                             
                                void setHandlerEvents() {
                                    review.addActionListener(new ActionListener() {
                                        public void actionPerformed(ActionEvent e) {
                                            JFileChooser chooser = new JFileChooser();                      
                                            chooser.setCurrentDirectory(new File("."));
                                            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                                            int r = chooser.showOpenDialog(SearchZipBomb.this);
                                            if (r == JFileChooser.APPROVE_OPTION) {
                                                listZipBomb.setText("");
                                                scanDir = chooser.getSelectedFile().getPath();
                                                directory.setText(scanDir);                    
                                            }
                                        }
                                    });
                                    start.addActionListener(new ActionListener() {
                                        public void actionPerformed(ActionEvent e) {
                                            if(scanDir.length() == 0) return;
                                            scanDirectory(scanDir);
                                        }
                                    });
                                }
                             
                                public void scanDirectory(String path) {
                                    File sd = new File(path);
                                    if(!sd.isDirectory()) return;
                                    File[] d = sd.listFiles(new ExtensionFilenameFilter());
                                    for(int i = 0; i < d.length; i++) {
                                        if(d[i].isFile()) {
                                            rootZip = d[i].getName();
                                            scanZipFile(d[i].getPath());
                                        }
                                        if(d[i].isDirectory()) {
                                            scanDirectory(d[i].getPath());
                                        }
                                    }
                                }
                             
                                public void scanZipFile(String zipName)
                                {
                                    try {
                                         ZipFile fZip = new ZipFile(zipName);
                                        Enumeration en3 = fZip.entries();
                                        ZipEntry e1 = (ZipEntry) en3.nextElement();
                                   }
                                    catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                             
                             
                            class ExtensionFilenameFilter implements FilenameFilter{
                                public boolean accept(File dir, String name) {
                                    File f = new File(dir, name);
                                    if(f.isDirectory()) return true;
                                    if(f.getName().toLowerCase().endsWith(".zip")) return true;
                                    return false;
                                }
                            }
                            Цитата Geptor @
                            А вот как работать с архивами в архиве я не понима.

                            Очень просто - разархивировать его, и открыть как архив.
                              Вот типа метод сканирующий архивы в архиве. Только он написан для архива вид которого я привел выше. Дело в том что код как вы видите карявый. Помогите поправить чтоб код был получше, ведь метод должен выть рекурсивный(эт пока ток набросок).
                              ExpandedWrap disabled
                                 public void scanZipFile(String zipName)
                                    {
                                        try {
                                            ZipFile fZip = new ZipFile(zipName);
                                            Enumeration en1 = fZip.entries();
                                            ZipEntry e1 = (ZipEntry) en1.nextElement();
                                 
                                            ZipInputStream i1 = new ZipInputStream(fZip.getInputStream(e1));
                                            ZipEntry e2 = i1.getNextEntry();
                                            ZipFile f2 = new ZipFile(e2.getName());
                                            Enumeration en2 = f2.entries();
                                            ZipEntry e3 = (ZipEntry) en2.nextElement();
                                            ZipInputStream i2 = new ZipInputStream(f2.getInputStream(e3));
                                            ZipEntry e4 = i2.getNextEntry();
                                            i1.closeEntry();
                                            i1.close();
                                            i2.closeEntry();
                                            i2.close();
                                       }
                                        catch (IOException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                Всем спасибо.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0441 ]   [ 14 queries used ]   [ Generated: 18.05.24, 11:45 GMT ]