Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Doklejana PHPSESSID - nie XHTML
Forum PHP.pl > Forum > PHP
LamaMASTER
Witam,
Przy używaniu sesji, gdy session_use_trans_sid jest ustawione na on, sesja doklejana jest do linków - wiadoma rzecz. Ta nieszczęsna sesja jednak dokleja się tak:
Kod
&PHPSESSID=4d7cb8abad2943a844c2332734b57f8a

a nie:
Kod
&PHPSESSID=4d7cb8abad2943a844c2332734b57f8a

Dlatego walidator wywala błędy.
Jak zrobić, aby doklejana sesja była poprawna?
Próbowałem:
  1. <?
  2. {kod z sesjami}
  3. $content = ob_get_contents();
  4. $content = str_replace('&PHPSESSID', '&amp;PHPSESSID', $content);
  5. echo $content;
  6. ?>

Ale nie zadziałało, bo sesja jest doklejana już całkiem przy kompilowaniu skryptu. Nie wiem co zrobić. Swoją drogą zauważyłem, że twórcy php nie wiedzą co to XHTML (np. znaczniki FONT w hightlight_string).

Znalazłem następny błąd. Ten głupi php wstawia mi:
Kod
<input type="hidden" name="PHPSESSID" value="6886c6f9a3b7e462f8a3513ce7e203e1" />

W każdym formularzu. Nie miałbym pretensji gdyby nie to, że wstawia mi to zaraz po <form ...>, a tam musi być chociażby div przed tym, żeby byka nie wywaliło. Co na tą głupotę poradzić?
hwao
Było na forum smile.gif

Jest taki fajny klucz w konfiguracji który odpowiada wlaśnie za ten bajer:)

Poszukaj na forum smile.gif
LamaMASTER
Szukałem, ale tematy były głównie o logowaniu itp. Wpisywałem "sesion amp", "PHPSESSID amp", "session XHTML", "sesje XHTML" itp. No niestety nic nie znalazłem - same problemy z sesjami.
Byłbym wdzięczny za link smile.gif
LBO
XHTML i problem z ampersendem
LamaMASTER
Chyba chodziło ci o to:
http://wortal.php.pl/phppl/wortal/artykuly...m_z_ampersendem
smile.gif
Dobrze, że nakierowałeś mnie na stronę. Dzięki smile.gif
A już kombinowałem z
ini_set('session.name', 'amp;PHPSESSID'); biggrin.gif


A co z inputem w formach?

PS: zrobiłem to w .htaccess (bo do php.ini nie mam dostępu) i mam Internal Server Error. Czy mogę użyć zmiany w php.ini funkcją ini_set?

edit

podziałało:
  1. <?php
  2. ini_set('arg_separator.input', ";&");
  3. ini_set('arg_separator.output', "&amp;");
  4. ?>



Teraz tylko ten input winksmiley.jpg
hwao
Zmusiliście mnie do tego! Rkingsmiley.png

  1. <?php
  2. /**
  3.  * XHTMLSession
  4.  * 
  5.  * Kod dostępny za darmo, czyli słowem całkowite OpenSource
  6.  * Miło by było jakby została informacja o autorze.
  7.  * 
  8.  * @author Paweł `hwao` Halicki
  9.  * @version 1.0.0
  10.  */
  11. class XHTMLSession {
  12. /**
  13.  * Czy funkcja ini_set() zadziałała i zamienia
  14.  * wszyskie wstawione przez sesje & na odpowiednie znaki
  15.  *
  16.  * @var bold
  17.  */
  18. private $bIniSet = false;
  19. /**
  20.  * Na jaki znak ma zamienić wszyskie &
  21.  *
  22.  * @var string
  23.  */
  24. private $sAmp = '&amp;';
  25.  
  26. /**
  27.  * Konstruktor
  28.  *
  29.  * @param string $sAmp - na co ma zamienić sesyjne '&'
  30.  */
  31. public function __construct( $sAmp = '&amp;' ) {
  32. if( ini_set( 'arg_separator.output', $sAmp ) == false ) {
  33. $this->bIniSet = true;
  34. }
  35. $this->sAmp = $sAmp;
  36. }
  37.  
  38. /**
  39.  * XHTMLSession::prepareContent()
  40.  * 
  41.  * Przygotowuje string do bycia zgodnym z XHTML'em
  42.  * pozbywając się problemu sesji
  43.  *
  44.  * @param string $sContent - strign do przygotowania
  45.  * @param bool  $bIniSet - jezeli dasz true, to zawsze sie wlaczy.
  46.  * @return string
  47.  */
  48. public function prepareContent( $sContent, $bIniSet = false ) {
  49. $this->bIniSet = true;
  50. if( $this->bIniSet == false || $bIniSet ){
  51. $sContent = $this->SessionSeparator( $sContent );
  52. }
  53. return $this->SessionInput( $sContent );
  54. }
  55.  
  56. /**
  57.  * XHTMLSession::InputFormat()
  58.  * 
  59.  * Metoda służy do formatowania inputa dodawanego przez Sesje
  60.  * Opis tablicy, co dostarcza znajduje się w metodzie.
  61.  * Musisz zwrócić taka wartość na jaką chcesz, żeby został zamieniony standardow
    y input dostarczany przez sesje.
  62.  *
  63.  * @param array $aInput
  64.  * @return string
  65.  */
  66. private function InputFormat( $aInput ) {
  67. /**
  68.  * Opis tablicy $aInput
  69.  * 0 - cały input (taki jaki został złapany)
  70.  * 1 - parametr type z inputa
  71.  * 2 - parametr name z inputa
  72.  * 3 - parametr value z inputa
  73.  */
  74.  
  75. //return null; // Usunięcie go wogole.
  76. return '<div>'.$aInput[0].'</div>'; // Zamienia inputa na takiego, który jest wewnątrz <div></div>
  77. }
  78.  
  79. /**
  80.  * XHTMLSession::SessionSeparator()
  81.  * 
  82.  * Zamienia separator sesji, jeżeli nie może tego zrobić przez ini_set()
  83.  * Jeżeli nie wiesz co robisz, nic tu nie zmieniaj :)
  84.  *
  85.  * @param string $sContent
  86.  * @return string
  87.  */
  88. private function SessionSeparator( & $sContent ) {
  89. return preg_replace( '@&(?!amp;)@i', $this->sAmp, $sContent );
  90. }
  91.  
  92. /**
  93.  * XHTMLSession::SessionInput()
  94.  *
  95.  * Łapie inputa dodawanego przez sesje
  96.  * Jeżeli nie wiesz co robisz, nic tu nie zmieniaj :)
  97.  * 
  98.  * @param string $sContent
  99.  * @return string
  100.  */
  101. private function SessionInput( & $sContent ) {
  102. return preg_replace_callback( '@<input type="([^"]+)" name="([^"]+)" value="([^"]+)" />@i', array( $this, 'InputFormat' ), $sContent );
  103. }
  104. }
  105. ?>






  1. <?php
  2. // Przykład 1
  3. // Przystosowanie stringu
  4. $XHTMLSession = new XHTMLSession();
  5. $sContent = '& && &&&&& &&& & && & & &csccs ancjkanjk dbjkcdsbfkds & &&& && 
  6. tego &amp; nie ruszta :) dsads && 54645664&$dDSa&Dsadsada & & & tego &amp; tez
  7. To jakis wsciekly input
  8. <input type="hidden" name="PHPSESSID" value="tujestsesja" />
  9. fdsfs
  10. ';
  11.  
  12. // Jeżeli podajesz string i chcesz zamienić & które tam zostało "wpisane"
  13. // musisz ustawić 2 parametr metody true, ponieważ musi przeszukać ciąg
  14. // pomimo tego że nawet mogło działać ini_set(), ale w tym wypadku tam
  15. // ta funkcja nie mogła zadziałać.
  16. echo $XHTMLSession->prepareContent( $sContent, true );
  17. ?>


  1. <?php
  2. // Przykład 2
  3. // Przystosowanie całej strony, wykorzystując ob_start();
  4. $XHTMLSession = new XHTMLSession();
  5. ob_start( array( $XHTMLSession, 'prepareContent' ) );
  6. ?>
  7.  
  8. & && &&&&& &&& & && & & &csccs ancjkanjk dbjkcdsbfkds & &&& && 
  9. tego &amp; nie ruszta :) dsads && 54645664&$dDSa&Dsadsada & & & tego &amp; tez
  10. To jakis wsciekly input
  11. <input type="hidden" name="PHPSESSID" value="tujestsesja" />
  12. fdsfs


Ciebie powinien zainteresować 2 przykład smile.gif
Jeżeli coś nie działa, to napisz chetnie poprawie


Efekt działania:
  1. &amp; &amp;&amp; &amp;&amp;&amp;&amp;&amp; &amp;&amp;&amp; &amp; &amp;&amp; &amp; &amp; &amp;csccs ancjkanjk dbjkcdsbfkds &amp; &amp;&amp;&amp; &amp;&amp;
  2. tego &amp; nie ruszta :) dsads &amp;&amp; 54645664&amp;$dDSa&amp;Dsadsada &amp; &amp; &amp; tego &amp; tez
  3. To jakis wsciekly input
  4. <div><input type="hidden" name="PHPSESSID" value="tujestsesja" /></div>
  5. fdsfs
LamaMASTER
Buhehehehe, nieźle winksmiley.jpg Miałeś wenę biggrin.gif Ale wielkie dzięki - przyda się winksmiley.jpg

edit

&amp;'y już u mnie działały, więc postanowiłem pozbyć się tego z funkcji,a także pozbyć obiektowości, bo mam skrypt pisany nieobiektowo winksmiley.jpg. Pozostawiłem jedynie:
  1. <?php
  2. function SessionInput($content)
  3. {
  4.  return preg_replace_callback('@<input type="([^"]+)" name="PHPSESSID" value="([^"]+)" />@i', '<fieldset>1</fieldset>', $content);
  5. }
  6. ?>

i info o autorze winksmiley.jpg Jednak przy dodaniu:
ob_start('SessionInput'); wszystko gra, ale input dalej nie jest w fieldsecie. Tak samo było z str_replacem dla ampów - po prostu nie daje to efektu, bo sesje chyba są dodawane na sam koniec.
No nie wiem już co zrobić smile.gif
hwao
Malutka zmiana i powinno byc ok
  1. <?php
  2. function SessionInput( $content ) {
  3.  return preg_replace('@<input type="([^"]+)" name="PHPSESSID" value="([^"]+)" />@i', '<fieldset>0</fieldset>', $content);
  4. }
  5. ?>

preg_replace" title="Zobacz w manualu php" target="_manual() bez callback smile.gif
I z tego co pamietam nie \\1 tylko \\0 smile.gif
Powinno działać
LamaMASTER
Mam:
  1. <?php
  2. function SessionInput($content)
  3. {
  4.  return preg_replace_callback('@<input type="([^"]+)" name="PHPSESSID" value="([^"]+)" />@i', '<fieldset>1</fieldset>', $content);
  5. }
  6. ?>

Brak efektu smile.gif
No i z tego co ja pamiętam to \\1 smile.gif
LamaMASTER
Dalej to samo smile.gif
hwao
  1. <?php
  2. function SessionInput($content) {
  3.  return preg_replace('@<input type="([^"]+)" name="PHPSESSID" value="([^"]+)" />@i', '<fieldset>0</fieldset>', $content);
  4. }
  5.  
  6. ob_start('SessionInput');
  7. ?>
  8.  
  9. To jakis wsciekly input
  10. <input type="hidden" name="PHPSESSID" value="tujestsesja" />

To działa wiec problem musi byc gdzie indziej

Zrób tak:
  1. <?php
  2. function SessionInput($content) {
  3.  
  4. [b]file_put_contents( './dev.txt', $content );
  5. [/b]
  6.  return preg_replace('@<input type="([^"]+)" name="PHPSESSID" value="([^"]+)" />@i', '<fieldset>0</fieldset>', $content);
  7.  }
  8. ?>

I sprawdz czy w tym pliku znajduje sie ten input dodawany przez sesje, jezeli tak to znaczy ze robi ona to po dzialaniu tego skryptu, musisz znalesc miejsce w skrypcie (zapewne destruktor, chocby sesji) ktore wykonywane jest pozniej niz dodawanie przez sesje tego inputa






Chyba znalazlem rozwiazanie - jezeli te podane przezemnie nie skutkuje bedziesz musial przestawic jedna rzecz (podobnie jak z amp'ami).

Kod
[img]file:///C:/DOCUME%7E1/hwao/USTAWI%7E1/Temp/moz-screenshot.jpg[/img][img]file:///C:/DOCUME%7E1/hwao/USTAWI%7E1/Temp/moz-screenshot-1.jpg[/img][img]file:///C:/DOCUME%7E1/hwao/USTAWI%7E1/Temp/moz-screenshot-2.jpg[/img]; The URL rewriter will look for URLs in a defined set of HTML tags.
; form/fieldset are special; if you include them here, the rewriter will
; add a hidden <input> field with the info which is otherwise appended
; to URLs.  If you want XHTML conformity, remove the form entry.
; Note that all valid entries require a "=", even if no value follows.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="


Czyli musisz dac
  1. <?php
  2. ini_set('url_rewriter.tags', "a=href,area=href,frame=src,input=src,fieldset=");
  3. ?>

Chociaz jak cos jest nie potrzebne to mozna usunac znacznie wiecej (ale generalnie to nie wadzi, poza tym dodawanym inputem)

Chyba juz wszystko jasne? Rkingsmiley.png
LamaMASTER
Jesteś wielki - tak to podsumuję biggrin.gif

PS: nie ma to jak ini_set - załatwia wszystko biggrin.gif
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.