2010-01-15 16 views
32

Piszę skrypt, który przesyła plik do skryptu cgi, który oczekuje żądania wieloczęściowego, takiego jak formularz na stronie HTML. boundary to unikalny token, który zawiera adnotację o treści pliku w treści żądania. Oto przykład ciało:Generowanie wieloczęściowej granicy

--BOUNDARY 
Content-Disposition: form-data; name="paramname"; filename="foo.txt" 
Content-Type: text/plain 

... file contents here ... 
--BOUNDARY-- 

boundary nie może być obecny w zawartości plików, z oczywistych powodów.

Co należy zrobić, aby utworzyć niepowtarzalną granicę? Czy powinienem wygenerować losowy ciąg, sprawdzić, czy jest on w zawartości pliku, a jeśli tak, wygenerować nowy, spłukać i powtórzyć, aż mam unikalny ciąg? A może wystarczy "całkiem losowy token" (powiedzmy, połączenie sygnatury czasowej, identyfikatora procesu itp.)?

+2

Z jakiego języka programowania korzystasz? Zwykle takie rzeczy są obsługiwane przez bibliotekę. –

+0

Używam Ruby. Musiałby być w stdlib, ale nie może używać klejnotów, ponieważ skrypt powinien być uruchamiany w dowolnym systemie z zainstalowanym ruby, bez konieczności instalowania klejnotów. –

Odpowiedz

0

Jeśli czujesz paranoję, możesz wytworzyć losową granicę i wyszukać ją w ciągu znaków, który ma zostać wysłany, dodaj losowy znak do znalezienia. Ale moje doświadczenie jest takie, że dowolny nie-słownikowy ciąg złożony z 10 znaków jest niemożliwy do zrealizowania, więc wybranie czegoś takiego jak --- BOUNDARY --- BOUNDARY --- BOUNDARY --- jest całkowicie wystarczające.

+35

Nie, to nie wystarcza. Ponieważ nie będziesz mógł wysłać swojego kodu źródłowego programu (lub tego komentarza) za pomocą swojego programu. – stepancheg

+4

@stepancheg: Wygląda na to, że czujesz paranoję, w tym przypadku użyj rozwiązania z pierwszego akapitu mojej odpowiedzi. Jeśli jednak jesteś zdrowy psychicznie, użyj "Content-Encoding: gzip" i przestań się martwić o użytkowników, którzy próbują cię zdobyć. –

+0

Obowiązkiem programisty jest uniknięcie możliwych do przewidzenia przyszłych błędów. – BornToCode

46

Jeśli użyjesz czegoś losowego jak identyfikator GUID, nie powinno być potrzeby przeszukiwania ładunku w celu sprawdzenia aliasu granicy. Coś jak: -

---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
Nagłówek: ....

Ładowność
---- = NextPart_3676416B-9AD6-440C-B3C8- FC66DDC7DB45--

+2

Dzięki! Twoja odpowiedź jest równie dobra, jak otagowana odpowiedź, ale potrzebował przedstawiciela więcej niż Ty;) –

+2

ta odpowiedź jest lepsza, ponieważ identyfikator GUID został zaprojektowany tak, aby był "globalnie wyjątkowy". Kiedy można uzyskać identyfikator GUID z jednego wiersza kodu, po co próbować wymyślić własny losowy ciąg znaków? – Keith

12

Java facetów:

protected String generateBoundary() { 
      StringBuilder buffer = new StringBuilder(); 
      Random rand = new Random(); 
      int count = rand.nextInt(11) + 30; // a random size from 30 to 40 
      for (int i = 0; i < count; i++) { 
      buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]); 
      } 
      return buffer.toString(); 
     } 

private final static char[] MULTIPART_CHARS = 
      "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
        .toCharArray(); 

Przekierowanie: http://hc.apache.org/httpcomponents-client-ga/httpmime/xref/org/apache/http/entity/mime/MultipartEntity.html