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:
/**
 * Kódol speciális karaktereket %kod1% formában.
 * @param string
 *   A kódolandó szöveg.
 * @returns
 *   A kódolt szöveg.
 */
function encode(string) {
  // Lecseréljük a '@' és a '#' karaktereket.
  return string.replace(/[@#]/g, function (match) {
    var retval = '%kod';
    switch (match) {
      case '@': 
        retval += 1; 
        break;

      case '#': 
        retval += 2; 
        break;
    }
    retval += '%';
    return retval;
  });
}

/**
 * Kikódolja a speciális karaktereket, amiket az encode kódolt.
 * @param string
 *   A kikódolandó szöveg.
 * @returns
 *   A kikódolt szöveg.
 */
function decode(string) {
  // Amennyiben létezik kikódolási szöveg, akkor azt használjuk, vagy az eredetit, amennyiben nem.
  return string.replace(/%kod(\d+)%/g, function (match, kod) {
    switch (kod) {
      case '1':
        return '@';

      case '2':
        return '#';

      default:
        return match;
    }
  });
};
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:

<?php
// Minden egyes változót megfelelően escapelünk.
$params = array($valtozok['name'], $valtozok['id'], $valtozok['comment']);
$params = array_map('mysql_real_escape_string', $params);
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:
<body onload="replaceText()">
..
<div id="tartalom">
..
%kod1% %kod2%
..
</div>
..
</body>
pl.: a szöveged, a tartalom nevü div-ben úgy tudod lecserélni:
function replaceText() {
  var el = document.getElementById("tartalom");
  ..
  el.innerHTML = el.innerHTML.replace(/%kod1%/g, "Ez a kod1 tartalma");
  ..
}
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.