Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Ako preniesť z druhého okna pomocou JavaScriptu hodnotu do textarea (viac riadkovú)

Z databázovej tabuľky si vyberiem hodnotu:

$rec = mysql_fetch_array($sql);
$value = htmlspecialchars($rec[value]);

$value obsahuje niečo takéto:

Riadok 1
Riadok 2   s 3 medzerami
Riadok 3

Túto hodnotu môžem jednoducho zobraziť v textarea:

<textarea name="text1"><pre>
  $value
</pre></textarea>

Lenže ja ju priradím z druhého okna pomocou JavaScriptu:

<a href='javascript:vloz("$value")'>Adresa</a></td>
function vloz(value)
{
  window.opener.forms.form1.text1.value = value;
}

A tu nastane problém. Totiž všetko riadkovanie sa mi rozbije a všetko sa nasúka do jedného riadku bez jedinej oddeľovacej medzery:

Riadok 1Riadok 2   s 3 medzeramiRiadok 3

Ako som už zistil, problém je pri odovzdávaní premennej v href, lenže, ak by som aj znaky nového riadka premenil na <br> vo funkcii vloz() mi nefunguje replace(), ktoré je vraj nedefinované a teda nemôžem premeniť reťazec na pôvodný. Ako inicializáciu JavaScriptu používam:

<script language="JavaScript" type="text/javascript">

Treba tam zapísať aj verziu alebo je chyba niekde inde?

Edit: Dokonca nemôžem použiť ani nl2br(), pretože potom by som musel použiť ešte htmlspecialchars(), ale pri priraďovaní v JavaScripte reťazec týmto upravený byť nesmie, lebo sa mi to tak aj zobrazí v textarea. Čo s tým mám robiť?

Edit 2: Zmena názvu

Předmět Autor Datum
Je v obou dokumentech definováno správně a totožně kódování ?
Flash_Gordon 26.03.2008 18:18
Flash_Gordon
Určite že je, problém je pri prenose znaku nový riadok \n.
msx. 26.03.2008 18:56
msx.
Na výstupe chceš reťazec v JavaScripte, ktorý je v HTML atribúte. Takže musíš ten text zakódovať naj…
los 26.03.2008 21:08
los
Ďakujem. Ale ešte taká otázočka: Dá sa to automatizovať už nejakou existujúcou funkciou alebo sa mus…
msx. 27.03.2008 07:52
msx.
Musíš sa spoľahnúť na str_replace a počítať so všetkými štyrmi možnosťami.
los 27.03.2008 09:24
los
Označujem teda za vyriešené, aj keď robiť to budem najskôr zajtra.
msx. 27.03.2008 21:23
msx.
Takže, použil som str_replace() s parametrom array a nahradil som všetky úvodzovky, apostrofy, nové…
msx. 28.03.2008 09:55
msx.
Dúfam, že takto upravený text som cez HTML odovzdal JavaScriptu neznamená, že si urobil len $value =… poslední
los 28.03.2008 11:23
los

Na výstupe chceš reťazec v JavaScripte, ktorý je v HTML atribúte. Takže musíš ten text zakódovať najprv tak, aby z neho bol platný reťazec v JavaScripte a potom zakódovať tak, aby bol platným atribútom v HTML.

Zakódovanie do reťazca JavaScriptu spočíva v tom, že nahradíš spätné lomítka za \\, znaky pre nový riadok za \n a úvodzovky za \" resp. \'.
Na zakódovanie do atribútu HTML potom použiješ htmlspecialchars.

Takže, použil som str_replace() s parametrom array a nahradil som všetky úvodzovky, apostrofy, nové riadky a lomítka, takto upravený text som cez HTML odovzdal JavaScriptu a ten potom po priradení do textarea vykonal htmlspecialchars() automaticky. Ďakujem za pomoc, funguje to tak ako má.

Dúfam, že takto upravený text som cez HTML odovzdal JavaScriptu neznamená, že si urobil len $value = str_replace(...) a potom to vložil priamo do HTML <a href='javascript:vloz("$value")'>Adresa</a></td>.

V prípade, že $value = "abc'><script>alert(123)</script>", by výsledok mohol vyzerať takto:

<a href='javascript:vloz("abc\'><script>alert(123)</script>")'>Adresa</a>

Potom by vloženie napr. cookie stealera bolo hračkou.

Rovnaký problém existuje, ak to vkladáš priamo do elementu script. Akýkoľvek výskyt reťazca </script> spôsobí ukončenie elementu script. Vtedy treba myslieť aj na to a napr. nahradiť to za </scr" + "ipt>. (Edit: alebo lepšie je použiť escape sekvenciu, napr. \x3c namiesto <.)

Zpět do poradny Odpovědět na původní otázku Nahoru