ugrás a tartalomhoz

html kód szűrése

sandrosdj · 2012. Szep. 15. (Szo), 14.28
Üdv!

Adatbázisban tárolok html kódokat (hozzászólások, cikkek stb.) és semmiféle tiltást nem akarok rajta alkalmazni (minden tag engedélyezve van) csak egy bizonyos dolgot szeretnék szűrni, mégpedig, hogy ne lehessen a javascriptes alert() függvényt használni.

Tehát ha van egy ilyen kódom:
Lalalalala
<script>
var llalala="sajt";
alert(llalala);
document.write(llalala);
</script>
Akkor csak az alert(llalala); rész ne fusson le (ne legyen a kódban sem benne) a többi ugyan úgy maradjon meg.

Ez hogyan kivitelezhető? Valamifajta regexp-re gondoltam, de nem találtam használhatót.
 
1

:) viszonylag nevhezenvar

szabo.b.gabor · 2012. Szep. 15. (Szo), 15.08
:)

viszonylag nevhezen
var jani='al'+'ert';
eval(jani+'(\'bela\')');
de mondjuk az alert hatását ki lehet iktatni.
function alert(msg){ console.log(msg); }
alert('jani');
hogy mi értelme van mindannak amit akarsz nem firtatom..
2

Nem is kell eval

Poetro · 2012. Szep. 15. (Szo), 18.37
Nem kell eval a fentihez. Elegendő csupán
window['al'+"ert"]('Józsi');
3

Felülírás így?

Pepita · 2012. Szep. 15. (Szo), 23.59
A második megoldás js-ben tényleg így műxik? Bármit (vagy semmit) beírhatok a fv-en belülre, a névazonossággal felülírtam a "gyárit", és jónapot? Nem tudom, miért olyan furcsa ez nekem, de js-ből van mit tanulnom...

(A célkitűzést én sem értem. Egyáltalán: js-t nem kiszűrni?!)
4

Igen

Poetro · 2012. Szep. 16. (V), 09.43
Igen, ennyire egyszerű felülírni egy függvényt. Természetesen nem minden függvényt lehet így felülírni, például azokat amiket natív beépülők hoznak létre, azokkal lehet probléma. Például nem írja felül, de nem is dob hibát.
9

Köszi az infót

Pepita · 2012. Szep. 16. (V), 23.43
Én azért óvatosan duhajkodnék vele, így egész más viselkedést ki lehet hozni egy böngészőből...
5

Nem hiába tettem a php-s

sandrosdj · 2012. Szep. 16. (V), 10.39
Nem hiába tettem a php-s témába a dolgot.

Szóval, van egy ilyen:
<?php
  echo remove_alerts($source);
?>
és itt a remove_alerts() php függvénynek az lenne a szerepe, hogy egyszerűen törölje a script tageken belül lévő alert()-eket (akármi van az alerten belül, ne legyen benne a html kimenetben az alert(12345) sem.

A kérdés az, hogy mi kerüljön a remove_alerts() függvénybe?

Ennek az az értelme, hogy bárki bármilyen kódot használhat és az általa írt kód hiánytalanul maradjon meg AB-ban, de a kiíratásnál ezek mégsem szerepeljenek benne (mert ugye mindenkit idegesít a felugró ablak, főleg ha tele van vele az oldal trolloknak köszönhetően).

A függvény felülírása jól jönne, ha máshol nem lenne szükség az alert-re.
6

Nem lehetséges

Poetro · 2012. Szep. 16. (V), 10.49
Ahogy fentebb láttad, teljesen felesleges eltávolítani, mivel ettől még a függvény meghívható. Főleg, ha valaki, mint a mindenféle kártevők, tömöríti a kódot. Ekkor ugye semmi nyoma nem marad annak, hogy eredetileg volt benne alert. A másik dolog, hogy igencsak bonyolult lenne egy ilyet megírni, mivel teljes nyelvi elemzés kell hozzá. Ugyanis rengeteg dolgot lehet az alert-be írni, amitől még szintaktikailag és szemantikailag is helyes marad, de az elemzést igencsak megnehezíti.
alert('bela');
alert('csaba)');
alert("da')vid'");
alert(/*)*/window);
alert
  ('elem\
    er');
alert(
  'ferenc'+
  alert(1+2)
);
alert
( // );
"geza");
Igazából egy AST-t kellene építeni a JavaScript kódból, és ebből eltávolítani az alert-re való hivatkozásokat. PHP-ban nem tudok JavaScript szintaktikai elemzőt, de JavaScript, Java és Common Lisp alatt tudom, hogy vannak.
8

Igazából egy AST-t kellene

tgr · 2012. Szep. 16. (V), 20.10
Igazából egy AST-t kellene építeni a JavaScript kódból, és ebből eltávolítani az alert-re való hivatkozásokat.


Semmilyen "külső" módon nem tudod megakadályozni, hogy egy Turing-teljes nyelvben írt program legyártson egy adott stringet, márpedig javascriptben ha le tudsz gyártani egy stringet, akkor meg is tudod hívni a megfelelő függvényt. Nagyjából két lehetőséged van: vagy eltávolítod a nyelvből az alert függvényt (ami nem triviális, mert pl. létrehozhat egy iframet, és máris van egy intakt window objektuma), vagy megakadályozod a string->függvény konverziót (reménytelenül nehéz, és egy csomó alapvető dolgot ki kell hozzá irtani, pl. setTimeout). Szóval egyszerűbb el se kezdeni.
7

BBcode?

eddig bírtam szó nélkül · 2012. Szep. 16. (V), 11.12
HTML helyett valami egyéb formázás nem lenne jobb?
Gyanítom, előbb-utóbb rájössz (miután trollokat emlegettél), hogy nem csak az alert problémás, sőt...
Pl. IP címek levadászásához, egyéb csúnyaságokhoz fel lehet használni iframe-et, img-t is stb.
Szóval olyan helyre ahová nem csak egy szűk körnek van joga írni, én nem engednék html-t.
10

Írta

Pepita · 2012. Szep. 16. (V), 23.58
Többen is megkérdőjeleztük ennek ésszerűségét, de js-re nézve pontosan leírta, hogy csak az alert-et akarja tiltani. Ha meg lehet js, akkor már kb. 0 biztonsági különbséget jelent az, hogy HTML is (ugye js-el olyan HTML-t csinál, amilyet akar). Lehet, hogy oka van erre, de szerintem vki(k) meg fogja szivatni vele.

Ha ez vmi js-tuningoló oldal akar lenni, akkor érdemesebb egész más oldalról közelíteni (pl. így), de inkább az kéne, hogy elárulja a kérdező, hogy milyen funkciót akar megvalósítani.
11

Van egy olyan oldalam, ahol a

sandrosdj · 2012. Okt. 25. (Cs), 17.40
Van egy olyan oldalam, ahol a felhasználók készíthetnek a profiljukon saját tartalmat és nem akarom megtiltani a html formátumú szerkesztést, hanem csak bizonyos funkciókat, kódrészleteket.

Tehát pl. tudjanak bármit beágyazni, de felugró ablakokat ne tudjanak beleírni a kódba (js alert pl).

Közben előjött egy másik olyan dolog is, amit meg kellene oldani, mégpedig a css. Ha valaki használni szeretne css-t is és beleírja a kódba a következő módon és az osztály (class) neve megegyezik egy már, az oldalon használtéval az a (nevezzük úgy) keret oldal kinézetét teheti tönkre. Ezt is jó lenne olyasmi módon kiszűrni, hogy a felhasználó által megadott css osztályok neveit ismerje fel és írja át másra.
<style>
.avatar { border: 2px solid red; }

.jozsi { float: left; }
</style>
ebből lenne ez:
<style>
._sajtosperec_avatar { border: 2px solid red; }

._sajtosperec_jozsi { float: left; }
</style>
...továbbá ugyan ezeket a módosításokat végezze el a kód további részeiben is.
12

Mint azt már korábban

Poetro · 2012. Okt. 25. (Cs), 19.02
Mint azt már korábban leírtam, ha valamilyen kódot engedélyezel, ami JavaScript, és nem egy általad kitalált nyelv, akkor akármit meg tudnak csinálni. Például a következő is feldob egy alertet a fail üzenettel:
this[(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]]((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]])
Ezt is jó lenne olyasmi módon kiszűrni, hogy a felhasználó által megadott css osztályok neveit ismerje fel és írja át másra.

Vannak CSS parser-ek, azokat kellene használni, és módosítani vele a kódot.
13

Figyelmeztetés

bamegakapa · 2012. Okt. 29. (H), 18.37
Még most szólok, hogy az úton, amerre el akarsz indulni, csak fájdalom és szenvedés vár. Hallgass a többiekre, és ne engedélyezz ilyesmit a felhasználóidnak.