Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SSL, PDFLib, a sprawa POSTa.
Forum PHP.pl > Forum > PHP
dragossani
Mam następujący problem:

Używam biblioteki PDFLib do dynamicznego generowania PDFów przez php. Napisałem 2 skrypty. Pierwszy zawiera formularz który po odpaleniu SUBMITa ma przesłać dane do drugiego skryptu. Drugi skrypt ma na podstawie przysłanych zmiennych wygenerować PDFa. Obydwa skrypty chcę odpalić przez HTTPS. Sprawa rypie się w momencie wysyłania danych. Przeglądarka (IE6PL) wyrzuca komunikat: "Otwierana strona zawiera zarówno elementy bezpieczne jak i takie, które nie są bezpieczne. Czy chcesz wyświetlić elementy, które nie są bezpieczne?". Obojętnie czy wybierze się TAK czy NIE, PDF generuje się prawidłowo. Można potem zajrzeć do Plik->Właściwości i jeśli wybraliśmy przy pytaniu TAK to mamy tam: "Transmisja - nie zaszyfrowano". Nie bardzo mi się to podoba. sad.gif

Co ciekawe jeżeli do wysłania formularza używam metody GET problem znika. Niestety zależy mi żeby był to POST. Jak zlikwidować ten komunikat? Problem nie jest chyba banalny, bo spotkałem się z tym komunikatem np. podczas sprawdzania stanu konta przez internet w banku WBK. Nie za każdym razem co prawda ale jednak. Skoro tam jest z tym problem... :? (stać ich chyba żeby poszukać rozwiązania)

Zastanawiam się czy nie ma to jakiegoś związku z budowaniem nagłówka przez drugi ze skryptów?

Kod
$buf = PDF_get_buffer($p);

$len = strlen($buf);

header("Content-type: application/pdf");

header("Content-Length: $len");

header("Content-Disposition: inline; filename=dokument.pdf");

print $buf;

PDF_delete($p);


Dla jasności poniżej wklejam kod formularza:

Kod
<BODY>

<FORM NAME="Form1" ACTION="generuj_pdfa.php" METHOD="POST">

<INPUT TYPE="HIDDEN" NAME="zmienna" VALUE="wartosc">

<A HREF="javascript:document.Form1.submit()">Link</A>

</FORM></BODY>


Będę wdzięczny za każdą sugestię.
castor
i co ci tu pomoc? :?

przeciez sam doszedles do pewnych wnioskow i zauwazyles tez takie zachowanie na stronach firm ,ktore raczej powinny znalezc rozwiazanie tego problemu....wiec chyba ciezko bedzie :wink:


tak juz jest ze starsz przegladrki nie informowaly nas o przekazach informacji nie szyfrowanych na stronach szyfrowanych.
...jak znajde troche czasu pobawie sie tym i jak mi cos wpadnie do glowy to dam ci znac na maila
dragossani
Może na jakimś ogólnoświatowym forum coś się dowiem... Chyba zarzucę temat na PHPBuilder albo Zend'a. Tnx za dobre chęci :wink:
dragossani
Jak na razie wygląda na to, że temat umarł śmiercią naturalną :wink:
W międzyczasie miałem dłuższy czas problem z zagadką pośrednio związaną z tematem. Mianowicie nie mogłem uruchomić sesji php, a następnie wygenerować PDF-a bo nagłówki zostały już wysłane i przeglądarka zaczynała wierzgać. Problem udało mi się ostatnio rozwiązać więc postanowiłem o tym napisać bo byćmoże przyda się to komuś. Przed uruchomieniem sesji poleceniem session_start(); (bądź innym które odpala sesję) należy ustawić:
Kod
session_cache_limiter('private');
I po problemie. Niestety komunikatu o tym, że strona zawiera niezabezpieczone dane nie udało mi się jeszcze zwalczyć.
wool
Wydaje mi się, że to co jest szyfrowane a co nie zależy od ustawień serwera. Looknij na stronę OpennSSL może tam coś znajdziesz.
dragossani
Cytat
Wydaje mi się, że to co jest szyfrowane a co nie zależy od ustawień serwera. Looknij na stronę OpennSSL może tam coś znajdziesz.
Z tego co udało mi się dotychczas dowiedzieć wynika, że metoda POST zasadniczo nie jest w ogóle szyfrowana, pomimo odpalania strony przez SSL.
Wydaje mi się jednak, że szukając rozwiązania wpadłem na odpowiedni trop: funkcje biblioteki CURL. Dokumentacja nie opisuje bezpośrednio przypadku wysyłki metodą POST przy użyciu szyfrowania przez SSL ale zerknijcie na ostatnią wiadomość w tym wątku: http://www.phpbuilder.com/board/showthread...postid=10217537. Wygląda na to, że tu jest pies pogrzebany. smile.gif
wool
Cytat
metoda POST zasadniczo nie jest w ogóle szyfrowana, pomimo odpalania strony przez SSL
A dlaczego niby miała by być nieszyfrowana? Istnienie SSL nie miałoby sensu gdyby nie byłoby możliwości szyfrowania. Ten kod co napisałeś niczego nie wygeneruje. Sprawdzałem przesyłanie POSTem przez SSL i działa bez problemów. Ale gdy dodałem generowanie pdf-a otworzyło się okienko pobierania pliku. Prawdopodobnie nie zostały przesłane nagłówki. Swoją drogą generowanie pdf przez ssl zamęczy serwer.
dragossani
Sądzę, że z tym post'em masz rację. SSL po to jest, żeby szyfrował wszystko. A jednak IE wywala ostrzeżenie o niezaszyfrowanych danych... Coś tu się nie zgadza.

Ten kod wygeneruje co trzeba. Musi być tylko PDFLib, no i trzeba wypełnić odpowiednimi danymi bufor (zmienna $p). Nie pisałem całego skryptu, bo sądziłem, że problem może tkwić w nagłówku. Jeśli chcesz mogę wrzucić jakiś większy kawał skryptu (taki żeby działał).

Okienko do zciągania pliku otwarło ci się prawdopodobnie dlatego, że nie masz Acrobat Readera zintegrowanego z przeglądarką. Nagłówek jest w trybie "inline", jeśli może to wskakuje do przeglądarki.

A czy generowanie PDF-a przez SSL zamęczy serwer... Hm... Nie wiem dlaczego miałoby zamęczyć. Serwer jest mocny, pdf jest wewnętrznie pakowany więc ma nie więcej niż duży obrazek (parędziesiąt kilobajtów). A ssl musi być, bo PDFLib nie potrafi wygenerować zaszyfrowanego PDF-a (chyba żadna biblioteka do generoania dynamicznego tego nie potrafi - ja takiej w każdym razie nie znam), a dane w PDFie są równie tajne jak cała reszta.

Jeśli chcesz kompletny skrypt do generowania PDF-a to daj znać.
wool
Acrobat Reader-a nie mam ale Acrobat - tak. Bez SSL generuje się OK, jednak gdy wywpłam ten sam skrypt przez https otwiera się okienko pobierania pliku. Ja mam tak to napisane:
<index.php>
Kod
..<FORM NAME="Form1" ACTION="pdf.php" METHOD="POST">

<INPUT TYPE="Text" NAME="zmienna">

<Input type="submit" value="Wyślij">..

<pdf.php>
Kod
<?

$pagecount = 1;

$pdf = pdf_new();

if (!pdf_open_file($pdf, "")) {

    print error;

    exit;

};

while($pagecount-- > 0) {

    pdf_begin_page($pdf,595,842);

    pdf_translate($pdf,10,800);

    pdf_save($pdf);

    pdf_restore($pdf);

    pdf_set_font($pdf, "Times-Roman", 30, "host");

    pdf_show($pdf,$_POST['zmienna']);

    pdf_end_page($pdf);

}

pdf_close($pdf);

$buf = pdf_get_buffer($pdf);

$len = strlen($buf);

header("Pragma: no-cache");

header("Cache-Control: no-store, no-cache, must-revalidate");

header("Cache-Control: post-check=0, pre-check=0", false);

header("Content-type: application/pdf");

header("Content-Length: $len");

header("Content-Disposition: inline; filename=foo.pdf");

print $buf;

pdf_delete($pdf);

?>

A co do "męczenia serwera" to wydaje mi się że będzie mocno obciążony, pdf nie są małe, przejżyj logi ssl.
dragossani
Co do wielkości PDF-a - ustaw sobie w skrypcie:
Kod
pdf_set_value($pdf,"compress", 9);
i porównaj rozmiar pliku wynikowego.

A ten SSL ciekawie się u Ciebie zachowuje. Nagłówek jest przecież inline, nie powinien traktować go jako attachment. Zmiana na https nie powinna na to wpływać. Nie wywala nic o nieszyfrowanych danych? Jeśli moższ, sprawdź jeszcze jak się zachowuje po użyciu obrazka w treści PDF-a oraz własnego fontu. Czyli:
Kod
PDF_set_parameter($pdf,"resourcefile","/ścieżka/do/pdf_lib/fonts/pdflib.upr");

$times=PDF_findfont($pdf,"Times New Roman","iso8859-2",1);

PDF_setfont($pdf,$times,8);

oraz
Kod
if (($image=PDF_open_image_file($pdf, "jpeg", "obrazek.jpg", "", 0)) == -1 )

{

    PDF_set_text_pos($pdf,1,1);

    PDF_show($pdf,"Błąd ładowania obrazka!");

} else {

    PDF_place_image($pdf, $image, (float) 5, (float) 5, (float) 1);

    PDF_close_image($pdf, $image);

};

Oczywiście w pliku pdflib.upr musisz mieć
Kod
Encoding

iso8859-2=iso8859-2.enc

iso8859-2=iso8859-2.cpg

oraz
Kod
FontOutline

Times New Roman=TIMES.TTF

A times.ttf w katalogu tym samym co pdflib.upr.

Jeśli będzie Ci się chciało to napisz jakie wrażenia.
wool
Sparawdzę to co napisałeś. Poprawiłem kod pdf.php bo nie z tego pliku wstawiłem tylko chyba z Twojego.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.