ugrás a tartalomhoz

String csere Javascript-el, honlapon belül.

norby1 · 2010. Feb. 14. (V), 22.28
Sziasztok!

Egy honlap fórum részéről van szó. A hozzászólásnál nem akarom a felhasználókat szigorúan korlátozni, hogy csak betűket, számokat használhassanak.
Arra gondoltam, hogy a hozzászólásokban minden spec karaktert kicserélek egy ártalmatlan karaktersorozatra pl. %kod1%, majd egy md5 kódolás után írnám be az adatbázisba. Ezzel meg van a védelem is. Ez a része megy az elképzelésemnek.
Hozzászólás listázásánál gondolom Javascript-tel kellene játszani, hogy visszacserélje a kódokat karakterre: pl. %kod1% -> @

Javascriptet még nem használtam, csak tudom, hogy mire való. Szeretnék Tőletek segítséget, egy "Helló Világ" bonyolultságú példát kérni erre a cserére.
 
1

Megoldás

Poetro · 2010. Feb. 14. (V), 23.07
A kódolást, és kikódolást végző JavaScript valahogy így nézne ki:
  1. /** 
  2.  * Kódol speciális karaktereket %kod1% formában. 
  3.  * @param string 
  4.  *   A kódolandó szöveg. 
  5.  * @returns 
  6.  *   A kódolt szöveg. 
  7.  */  
  8. function encode(string) {  
  9.   // Lecseréljük a '@' és a '#' karaktereket.  
  10.   return string.replace(/[@#]/g, function (match) {  
  11.     var retval = '%kod';  
  12.     switch (match) {  
  13.       case '@':   
  14.         retval += 1;   
  15.         break;  
  16.   
  17.       case '#':   
  18.         retval += 2;   
  19.         break;  
  20.     }  
  21.     retval += '%';  
  22.     return retval;  
  23.   });  
  24. }  
  25.   
  26. /** 
  27.  * Kikódolja a speciális karaktereket, amiket az encode kódolt. 
  28.  * @param string 
  29.  *   A kikódolandó szöveg. 
  30.  * @returns 
  31.  *   A kikódolt szöveg. 
  32.  */  
  33. function decode(string) {  
  34.   // Amennyiben létezik kikódolási szöveg, akkor azt használjuk, vagy az eredetit, amennyiben nem.  
  35.   return string.replace(/%kod(\d+)%/g, function (match, kod) {  
  36.     switch (kod) {  
  37.       case '1':  
  38.         return '@';  
  39.   
  40.       case '2':  
  41.         return '#';  
  42.   
  43.       default:  
  44.         return match;  
  45.     }  
  46.   });  
  47. };  
Ugyanakkor nem értem, miért szeretnéd ezt JavaScripttel kódolni, illetve kikódolni. Mi van, ha a felhasználónál nincs bekapcsolva a JavaScript? Mi van ha csak a tartalom beküldésekor nincs? Mi van, ha csak a tartalom megtekintésekor nincs? Fontos-e, hogy a keresőmotorok mit látnak az egészből?

Hogyan akarod a kódolást alkalmazni a szövegre? Mikor? Egyáltalán miért nem a szerver oldalon történik a kódolás, dekódolás, ha egyáltalán szükség van rá, mert egyáltalán a létjogosultságát kérdőjelezem meg a kérdésnek.

Mit akarsz MD5-tel csinálni? Mivel az MD5 egy hash-t ad vissza, amiből nem állítható elő az eredeti szöveg, nem értem, mire akarod használni.
3

Lehet nem volt egyértelmű a megfogalmazás!? Elnézést.

norby1 · 2010. Feb. 15. (H), 10.16
Helyesbítek:

Kódolás:
A felhasználó a hozzászólását beküldi. A form-ot feldolgozó PHP lecseréli a hozzászólás mezőjének speciális karaktereit, és csak ezután rögzítem az adatbázisba a mysql_query(...) függvénnyel a form adatait. Ezzel kivédtem az SQL injection támadásokat is. Ugye mindenhol azt olvasom, hogy ne bízzak a felhasználóban!

Dekódolás:
Ha már szerver oldalon dekódolnék, akkor mivel minden karakter meg van engedve, a hozzászólásba beszúrhatóak HTML tag-ek, pl. egy hatalmas kép beszúrható a hozzászólásba ( <img src="...." /> ), és máris romba dől az oldal szerkezete. Ezért gondoltam azt, hogy egy Javascript függvény dekódolna, és így a böngésző nem dolgozza fel beszúrt HTML kódot(?), hanem csak megjeleníti.

Amúgy köszönöm a válaszokat, kipróbálom a JS dekódolást a mai nap folyamán és megírom, hogy mire jutottam.
4

SQL Injection

Poetro · 2010. Feb. 15. (H), 11.21
Az SQL injection könnyen elkerülhető a megfelelő escape függvények használatával, MySQL esetén ez a mysql_real_escape_string, azaz ha vannak a változóim amiket el akarok menteni a $valtozok tömbben, akkor:
  1. <?php  
  2. // Minden egyes változót megfelelően escapelünk.  
  3. $params = array($valtozok['name'], $valtozok['id'], $valtozok['comment']);  
  4. $params = array_map('mysql_real_escape_string'$params);  
  5. mysql_query("INSERT INTO tabla (name, id, comment) VALUES ('". implode("', '"$params) ."')");  
A másik dolog, hogy hiába a JavaScript rakja be a tartalmat attól még a nagy kép továbbra is nagy marad, azaz ezzel nem értél el semmit, hacsak nem teszed a képet eleve kisebbre, mondjuk az <img src="..." width="300" /> használatával, valamint használhatsz mindenféle HTML szépítő, javító kódot, amivel kigyomlálhatod az invalid HTML elemeket, és a validokat meg megfelelő formára hozod, hogy a HTML szerkezet ép maradjon. Ilyen például a HTML Purifier, illetve még találsz párat, igényeidnek megfelelően.
5

Rájöttem!!

norby1 · 2010. Feb. 15. (H), 13.36
Így írtam: "...és így a böngésző nem dolgozza fel beszúrt HTML kódot(?), hanem csak megjeleníti."

Próbálgattam és rájöttem, hogy rossz irány volt ez a JavaScript. Hiába dekódolok JS-el, amint kicserélődik egy string pl. <b> -re a böngésző újra feldolgozza azt, és megvastagítja az utána következő szöveget. Persze, hogy nem értettétek, hogy mit akartam, teljesen tévúton jártam :$

Viszont nézegettem a honlapok forráskódjait és rájöttem, ha azt akarom, hogy ne dolgozza fel a böngésző a speciális karakterek, akkor azt ilyen formára kell kicserélnem: &#60; (ez ugye a < jel megfelelője).

Ne haragudjatok a téma nyitásért! Arra azért jó volt, hogy segítségetekkel egy-két dolgot megtanuljak a JavaScript -ről. Köszönöm mindenkinek, hogy foglalkoztatok a kérdésemmel!!
2

replace

ironwill · 2010. Feb. 14. (V), 23.13
Szia!

A szöveg típusú elemekre tudsz replace függvényt hívni:
  1. <body onload="replaceText()">  
  2. ..  
  3. <div id="tartalom">  
  4. ..  
  5. %kod1% %kod2%  
  6. ..  
  7. </div>  
  8. ..  
  9. </body>  
pl.: a szöveged, a tartalom nevü div-ben úgy tudod lecserélni:
  1. function replaceText() {  
  2.   var el = document.getElementById("tartalom");  
  3.   ..  
  4.   el.innerHTML = el.innerHTML.replace(/%kod1%/g, "Ez a kod1 tartalma");  
  5.   ..  
  6. }  
Ez a javascript lecseréli a kod1 nevü tartalmat, a "Ez a kod1 tartalma" tartalomra.

Értelemszerűen, ahány dolgot le akarsz cserélni, annyi sorod lesz.

Remélem jól értettem, hogy mit szerettél volna csinálni.
Sok sikert hozzá!

üdv, Gábor
u.i.: ajánlott pl. a www.w3schools.com-on nézegetni a JS leírásokat.