PDA

Bekijk Volledige Versie : replace functie / SQL injection



Joep
17/01/05, 09:45
Hallo

Om SQL injection te voorkomen, heb ik de volgende code geschreven.
Deze heb ik in mijn config.asp staan; een bestand die automatisch
wordt ingevoegd bij elke pagina. Waardes vraag ik op met

id=killchars(request("id")


Maar nu wil ik dat een variabele "true" wordt als hij één van de
woorden/letters heeft gevonden, zodat ik een tekst kan laten
weergeven.

Hoe doe ik dat?

René



function killChars(strWords)
'bron: http://www.sitepoint.com/article/sql-injection-attacks-safe,
'SQL Injection Attacks - Are You Safe?
'By Mitchell Harper
'June 17th 2002, aangetroffen op 17-1-2005
'Reader Rating: 9.2

dim badChars
dim newChars
badChars = array("select", "drop", ";", "--", "insert", "or",
"delete", "update", "xp_")
newChars = strWords

for i = 0 to uBound(badChars)
newChars = replace(newChars, badChars(i), "XXX")
'if -- iets gevonden then
response.write "<H1>Hé sukkel, jij dacht dat
je slimmer was dan ik?</h1>"
response.end
end if
next

newchars2= replace (newChars,"'","''", 1, -1, 1)

killChars = newChars2

end function

Daniel Tryba
17/01/05, 16:35
Joep <Joepiedepoepie@yepheck.com> wrote:
> id=killchars(request("id")
>
>
> Maar nu wil ik dat een variabele "true" wordt als hij ??n van de
> woorden/letters heeft gevonden, zodat ik een tekst kan laten
> weergeven.
>
> Hoe doe ik dat?

if StrComp(oudeString,nieuweString)<>0
then
var="true"
end if

of iets dergelijks.

John Bokma
17/01/05, 19:05
Joep wrote:

> Hallo
>
> Om SQL injection te voorkomen, heb ik de volgende code geschreven.
> Deze heb ik in mijn config.asp staan; een bestand die automatisch
> wordt ingevoegd bij elke pagina. Waardes vraag ik op met
>
> id=killchars(request("id")

Naar mijn mening is dat *altijd* fout.

Beter is:

test of id valt binnen de specificaties
zoniet -> geef een *foutmelding*.

Ga *nooit* onverwachtte input zitten fixen. Geef een fout naar de gebruiker
toe. Is ook handiger bij het debuggen dan alles zwijgzaam maar repareren.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Tjerk Wolterink
17/01/05, 19:05
Joep wrote:
> Hallo
>
> Om SQL injection te voorkomen, heb ik de volgende code geschreven.
> Deze heb ik in mijn config.asp staan; een bestand die automatisch
> wordt ingevoegd bij elke pagina. Waardes vraag ik op met
>
> id=killchars(request("id")
>
>
> Maar nu wil ik dat een variabele "true" wordt als hij één van de
> woorden/letters heeft gevonden, zodat ik een tekst kan laten
> weergeven.
>
> Hoe doe ik dat?
>
> René
>
>
>
> function killChars(strWords)
> 'bron: http://www.sitepoint.com/article/sql-injection-attacks-safe,
> 'SQL Injection Attacks - Are You Safe?
> 'By Mitchell Harper
> 'June 17th 2002, aangetroffen op 17-1-2005
> 'Reader Rating: 9.2
>
> dim badChars
> dim newChars
> badChars = array("select", "drop", ";", "--", "insert", "or",
> "delete", "update", "xp_")
> newChars = strWords
>
> for i = 0 to uBound(badChars)
> newChars = replace(newChars, badChars(i), "XXX")
> 'if -- iets gevonden then
> response.write "<H1>Hé sukkel, jij dacht dat
> je slimmer was dan ik?</h1>"
> response.end
> end if
> next
>
> newchars2= replace (newChars,"'","''", 1, -1, 1)
>
> killChars = newChars2
>
> end function
>

wat is dit een ongelooflijk domme anti-sql-injection methode. moehahah

John Bokma
17/01/05, 21:45
Tjerk Wolterink wrote:

>> 'Reader Rating: 9.2
> wat is dit een ongelooflijk domme anti-sql-injection methode. moehahah

Yup, en let op die Reader rating. Geeft een goed idee van het
lezerspubliek.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Daniel Tryba
17/01/05, 22:05
Tjerk Wolterink <tjerk@wolterinkwebdesign.com> wrote:
[http://www.leerquoten.nl/]
>
> wat is dit een ongelooflijk domme anti-sql-injection methode. moehahah

Verklaar je wat nader, met zo'n oneliner help je niemand.

John Bokma
18/01/05, 00:35
Daniel Tryba wrote:

> Tjerk Wolterink <tjerk@wolterinkwebdesign.com> wrote:
> [http://www.leerquoten.nl/]
>>
>> wat is dit een ongelooflijk domme anti-sql-injection methode. moehahah
>
> Verklaar je wat nader, met zo'n oneliner help je niemand.

Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen is het
beter om gewoon netjes te definieeren wat een id is, en daar op te testen.


--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Daniel Tryba
18/01/05, 01:55
John Bokma <postmaster@castleamber.com> wrote:
>>> wat is dit een ongelooflijk domme anti-sql-injection methode. moehahah
>>
>> Verklaar je wat nader, met zo'n oneliner help je niemand.
>
> Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen is het
> beter om gewoon netjes te definieeren wat een id is, en daar op te testen.

En dat is juist wat de OP min of meer wil. De test is tamelijk onzinnig,
de vraag niet.

Maar ik hoor het liever van foutkwootende, one liners producerende
moehahah poster.

John Bokma
18/01/05, 04:55
Daniel Tryba wrote:

> John Bokma <postmaster@castleamber.com> wrote:
>>>> wat is dit een ongelooflijk domme anti-sql-injection methode.
>>>> moehahah
>>>
>>> Verklaar je wat nader, met zo'n oneliner help je niemand.
>>
>> Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen is
>> het beter om gewoon netjes te definieeren wat een id is, en daar op
>> te testen.
>
> En dat is juist wat de OP min of meer wil.

Neuh, de OP wil dat we ff killchars uitbreiden, en dat vind ik geen slim
idee. Killchars in de prullenbak en dan opnieuw beginnen lijkt mij
handiger, dus voor de OP:

wat is precies een id?

> De test is tamelijk
> onzinnig, de vraag niet.

"Maar nu wil ik dat een variabele "true" wordt als hij één van de
woorden/letters heeft gevonden, etc."

Die is onzinnig, want volgens mij wil de OP nog steeds killchars gaan
gebruiken.

> Maar ik hoor het liever van foutkwootende,

Het stond er netjes onder. En aangezien zijn reaktie betrekking had op
de code wellicht niet zo fout.

> one liners producerende moehahah poster.

Oh, ik ben het met 'm eens de code is ongelooflijk dom.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Daniel Tryba
18/01/05, 12:05
John Bokma <postmaster@castleamber.com> wrote:
>>> Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen is
>>> het beter om gewoon netjes te definieeren wat een id is, en daar op
>>> te testen.
>>
>> En dat is juist wat de OP min of meer wil.
>
> Neuh, de OP wil dat we ff killchars uitbreiden,

Nee dat wil hij niet, zie het stukje pseudo code:
'if -- iets gevonden then
response.write "<H1>H? sukkel, jij dacht dat slimmer was dan ik?</h1>"
response.end
end if

Duidelijk toch, als iets matched, output + stoppen script. Helaas valt
het matchen in de category van indien er ergens het woord sex instaat dan
wordt het gefilterd: busexcursie is a naughty word.

>> De test is tamelijk
>> onzinnig, de vraag niet.
>
> "Maar nu wil ik dat een variabele "true" wordt als hij ??n van de
> woorden/letters heeft gevonden, etc."
>
> Die is onzinnig, want volgens mij wil de OP nog steeds killchars gaan
> gebruiken.

Dan weet hij toch dat iets neit voldoet en kan aan de hand van die var.
iets ondernemen.

>> Maar ik hoor het liever van foutkwootende,
>
> Het stond er netjes onder. En aangezien zijn reaktie betrekking had op
> de code wellicht niet zo fout.

Net zo fout als een TOFU, die bespaard me alleen nog dat ik moet
scrollen. Zinnig quoten houdt oa in dat de tekst niet integraal wordt
overgenomen om 1 regeltje toe te voegen.

>> one liners producerende moehahah poster.
>
> Oh, ik ben het met 'm eens de code is ongelooflijk dom.

Vertel, vertel, vertel (dat aan de OP).

Tjerk Wolterink
18/01/05, 15:15
Daniel Tryba wrote:
> John Bokma <postmaster@castleamber.com> wrote:
>
>>>>Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen is
>>>>het beter om gewoon netjes te definieeren wat een id is, en daar op
>>>>te testen.
>>>
>>>En dat is juist wat de OP min of meer wil.
>>
>>Neuh, de OP wil dat we ff killchars uitbreiden,
>
>
> Nee dat wil hij niet, zie het stukje pseudo code:
> 'if -- iets gevonden then
> response.write "<H1>H? sukkel, jij dacht dat slimmer was dan ik?</h1>"
> response.end
> end if
>
> Duidelijk toch, als iets matched, output + stoppen script. Helaas valt
> het matchen in de category van indien er ergens het woord sex instaat dan
> wordt het gefilterd: busexcursie is a naughty word.


Wat ik bedoel is: als je sql-injection wilt voorkomen dan moet je niet
domweg gaan testen of er sql termen in een bepaalde variable voorkomen.
nee (dat doet killchars toch, ben geen visual basic expert).
Je moet ervoor zorgen dat ook al staat er sql code in een string variabele dat ie
onmogelijk kan worden uitgevoerd, d.m.v. addslashes stripslashes.

Dat is wat ik bedoelde. En daarom is die code ongelooflijk dom.
Dus ik geef John Bokma gelijk: schrijf een nieuwe anti-sql-injection functie.


>
>
>>>De test is tamelijk
>>>onzinnig, de vraag niet.
>>
>> [knip]
>
>>>Maar ik hoor het liever van foutkwootende,
>>
>>Het stond er netjes onder. En aangezien zijn reaktie betrekking had op
>>de code wellicht niet zo fout.
>
>
> Net zo fout als een TOFU, die bespaard me alleen nog dat ik moet
> scrollen. Zinnig quoten houdt oa in dat de tekst niet integraal wordt
> overgenomen om 1 regeltje toe te voegen.

ok ik heb fout gequote: en?
niet iedereen is perfect. maar we hebben het nu niet over quoten.

>
>
>>>one liners producerende moehahah poster.
>>
>>Oh, ik ben het met 'm eens de code is ongelooflijk dom.
>
>
> Vertel, vertel, vertel (dat aan de OP).
>

Nou ik heb denk ik duidelijk uitgelegd waarom de code dom is.
Maarja het is ook visual-basic,
niet mijn favo programmeertaal.

Joep
18/01/05, 17:55
Op Tue, 18 Jan 2005 15:14:24 +0100 schreef Tjerk Wolterink
<tjerk@wolterinkwebdesign.com> en anderen:


>Wat ik bedoel is: als je sql-injection wilt voorkomen dan moet je niet
>domweg gaan testen of er sql termen in een bepaalde variable voorkomen.
>nee (dat doet killchars toch, ben geen visual basic expert).

>Je moet ervoor zorgen dat ook al staat er sql code in een string variabele dat ie
>onmogelijk kan worden uitgevoerd, d.m.v. addslashes stripslashes.
Helaas zijn dit PHP termen, maar ik ga zeker uitzoeken van het ASP
equivalent is.

>Dat is wat ik bedoelde. En daarom is die code ongelooflijk dom.
>Dus ik geef John Bokma gelijk: schrijf een nieuwe anti-sql-injection functie.
Als iemand tips/voorbeelden heeft in ASP hoor ik dat graag...

>>>Oh, ik ben het met 'm eens de code is ongelooflijk dom.
Tja, ik vond de gedachte wel slim: alle gevaarlijke elementen
uitbannen maar goed....

>> Vertel, vertel, vertel (dat aan de OP).
....het is overgekomen...

René

P.S. Volgens mij heb ik nu een beetje slordig gequtoe. Mijn excuses

John Bokma
18/01/05, 18:45
Joep wrote:

>>>>Oh, ik ben het met 'm eens de code is ongelooflijk dom.
> Tja, ik vond de gedachte wel slim: alle gevaarlijke elementen
> uitbannen maar goed....

Dat is altijd fout, want dan moet je alle gevaarlijke elementen weten.
Beter: maak een lijst van wat mag. Staat het niet in de lijst, dan is het
een gevaarlijk element. Jij weet wat mag. Maar jij weet wellicht niet wat
gevaarlijk is.

Dus als het een id is, wat een geheel getal tussen 1 en x moet zijn dan
test je:

1) is het een getal van 1 tot maximaal lengte van x cijfers
2) valt het id binnen het bereik van [ 1 .. x ]

Indien nee, dan geef je een fout.

Als id een string is, dan definieer je precies welke tekens er in mogen
zitten, en de minimale lengte en maximale lengte.

Vervolgens besturdeer je de documentatie van je database en kijk je of geen
van die tekens problemen op kunnen leveren (b.v. de ' kan dat opleveren,
maar dat haal je uit de documentatie en nooit van horen zeggen, of een
voorbeeld ergens gevonden (anders dan in de documentatie).

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

John Bokma
18/01/05, 18:55
Daniel Tryba wrote:

> John Bokma <postmaster@castleamber.com> wrote:
>>>> Zie mijn reaktie. In plaats van alle mogelijke hacks op te sommen
>>>> is het beter om gewoon netjes te definieeren wat een id is, en daar
>>>> op te testen.
>>>
>>> En dat is juist wat de OP min of meer wil.
>>
>> Neuh, de OP wil dat we ff killchars uitbreiden,
>
> Nee dat wil hij niet, zie het stukje pseudo code:
> 'if -- iets gevonden then
> response.write "<H1>H? sukkel, jij dacht dat slimmer was dan
> ik?</h1>" response.end
> end if

"Hallo

Om *SQL injection te voorkomen*, heb ik de volgende code geschreven.
Deze heb ik in mijn config.asp staan; een bestand die automatisch
wordt ingevoegd bij elke pagina. Waardes vraag ik op met

id=killchars(request("id")


Maar nu wil ik dat een variabele "true" wordt als hij één van de
*woorden/letters heeft gevonden, zodat ik een tekst kan laten
weergeven.*

Hoe doe ik dat?
"

Dus de OP wil killchars een true waarde laten opleveren zodat er een
bericht afgedrukt wordt, dus:

if (iets stouts) then "Stoute gebruiker";

En ik ben van mening dat dat fout is, en dat:

if ( not goed ) then "Stoute gebruiker";

Dit omdat de set goed bekend is (=specificatie).

> Duidelijk toch, als iets matched, output + stoppen script.

Ja, om "SQL injection te voorkomen"

>> Die is onzinnig, want volgens mij wil de OP nog steeds killchars gaan
>> gebruiken.
>
> Dan weet hij toch dat iets neit voldoet en kan aan de hand van die
> var. iets ondernemen.

Ik las het nog steeds in de context "SQL injection voorkomen". En niet:
we gaan sex er uit filteren.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Daniel Tryba
18/01/05, 19:15
Tjerk Wolterink <tjerk@wolterinkwebdesign.com> wrote:
> Wat ik bedoel is: als je sql-injection wilt voorkomen dan moet je niet
> domweg gaan testen of er sql termen in een bepaalde variable voorkomen.
> nee (dat doet killchars toch, ben geen visual basic expert).

Zoals ik al zie het is niet geweldig, maar nog steeds beter dan niets.

> Je moet ervoor zorgen dat ook al staat er sql code in een string variabele dat ie
> onmogelijk kan worden uitgevoerd, d.m.v. addslashes stripslashes.
>
> Dat is wat ik bedoelde. En daarom is die code ongelooflijk dom.
> Dus ik geef John Bokma gelijk: schrijf een nieuwe anti-sql-injection functie.

En laat dat nu net ook in die voorbeeld functie zitten. Maarja PHP
addslahes/stripslashes werkt bv niet op een Sybase database (tenzij je
de instellingen aanpast).

>>>Het stond er netjes onder. En aangezien zijn reaktie betrekking had op
>>>de code wellicht niet zo fout.
>>
>> Net zo fout als een TOFU, die bespaard me alleen nog dat ik moet
>> scrollen. Zinnig quoten houdt oa in dat de tekst niet integraal wordt
>> overgenomen om 1 regeltje toe te voegen.
>
> ok ik heb fout gequote: en?
> niet iedereen is perfect. maar we hebben het nu niet over quoten.

Ik had het er anders wel over, je dient je in het openbaar gewoon netjes
te gedragen.

>> Vertel, vertel, vertel (dat aan de OP).
>>
>
> Nou ik heb denk ik duidelijk uitgelegd waarom de code dom is.
> Maarja het is ook visual-basic,
> niet mijn favo programmeertaal.

Precies wat ik verwachte, een ongenuacneerde uitspraak mogelijk tgv een
gebrek aan kennis.

Daniel Tryba
18/01/05, 19:25
John Bokma <postmaster@castleamber.com> wrote:
>> Nee dat wil hij niet, zie het stukje pseudo code:
>> 'if -- iets gevonden then
>> response.write "<H1>H? sukkel, jij dacht dat slimmer was dan
>> ik?</h1>" response.end
>> end if
>
> "Hallo
>
> Om *SQL injection te voorkomen*, heb ik de volgende code geschreven.
> Deze heb ik in mijn config.asp staan; een bestand die automatisch
> wordt ingevoegd bij elke pagina. Waardes vraag ik op met
>
> id=killchars(request("id")
>
>
> Maar nu wil ik dat een variabele "true" wordt als hij ??n van de
> *woorden/letters heeft gevonden, zodat ik een tekst kan laten
> weergeven.*
>
> Hoe doe ik dat?
> "
>
> Dus de OP wil killchars een true waarde laten opleveren zodat er een
> bericht afgedrukt wordt, dus:

Je moet wel het _hele_ artikel lezen, inclusief code dus.

> if (iets stouts) then "Stoute gebruiker";

Ik lees toch echt iets anders in OP:

$str=foo($str)
if(var)
...

Immers 'een variabele "true" wordt' is iets anders dan de
geretourneerde waard.

Een OO oplossing kan natuurlijk ook.

John Bokma
18/01/05, 19:55
Daniel Tryba wrote:

> Tjerk Wolterink <tjerk@wolterinkwebdesign.com> wrote:
>> Wat ik bedoel is: als je sql-injection wilt voorkomen dan moet je
>> niet domweg gaan testen of er sql termen in een bepaalde variable
>> voorkomen. nee (dat doet killchars toch, ben geen visual basic
>> expert).
>
> Zoals ik al zie het is niet geweldig, maar nog steeds beter dan niets.

Ik weet het niet: wat is beter: iets wat een vals gevoel geeft van "dit
werkt", of ik zit onveilig.

> En laat dat nu net ook in die voorbeeld functie zitten. Maarja PHP
> addslahes/stripslashes werkt bv niet op een Sybase database (tenzij je
> de instellingen aanpast).

Wat ik niet snap is waarom PHP niet gewoon met prepared statements kan
werken (ik zie dat nooit tenminste, wel stipzusenzo, en base64 encoded
e.d.). Maar goed, ik snap wel meer niet van PHP. Bij Perl (tenzij ik het
niet snap), kan ik met een prepared statement *willekeurige* data ergens in
proppen zonder mij zorgen te hoeven maken. Dat heeft de maker van de driver
al gedaan, en daar vertrouw ik op. En dan zit je ook niet met het gezeur
dat die hack wel hier werkt, maar niet daar.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

John Bokma
18/01/05, 20:05
Daniel Tryba wrote:

> John Bokma <postmaster@castleamber.com> wrote:
>>> Nee dat wil hij niet, zie het stukje pseudo code:
>>> 'if -- iets gevonden then
>>> response.write "<H1>H? sukkel, jij dacht dat slimmer was dan
>>> ik?</h1>" response.end
>>> end if
>>
>> "Hallo
>>
>> Om *SQL injection te voorkomen*, heb ik de volgende code geschreven.
>> Deze heb ik in mijn config.asp staan; een bestand die automatisch
>> wordt ingevoegd bij elke pagina. Waardes vraag ik op met
>>
>> id=killchars(request("id")
>>
>>
>> Maar nu wil ik dat een variabele "true" wordt als hij ??n van de
>> *woorden/letters heeft gevonden, zodat ik een tekst kan laten
>> weergeven.*
>>
>> Hoe doe ik dat?
>> "
>>
>> Dus de OP wil killchars een true waarde laten opleveren zodat er een
>> bericht afgedrukt wordt, dus:
>
> Je moet wel het _hele_ artikel lezen, inclusief code dus.

Ok, ga ik nu doen :-D

>> if (iets stouts) then "Stoute gebruiker";
>
> Ik lees toch echt iets anders in OP:
>
> $str=foo($str)
> if(var)
> ...
>
> Immers 'een variabele "true" wordt' is iets anders dan de
> geretourneerde waard.

Ok, van wat ik begrijp:

Als er in mijn string een "bad word" zit dan wil ik niet alleen het "bad
word" wordt vervangen, maar ook een variable op true gezet wordt, zodat
ik een berichtje af kan drukken.

Kortom, de killchars SQL injection prevention moet niet alleen een

s/badword/XXX/g; doen over een inputstring, nee, het moet ook nog ff "He
Sukkel" terugsturen naar de browser.

Ik lees daar niks over sex e.d. Wel dat de OP een mogelijke scriptkiddie
een oorveeg wil geven.

Niet alleen is dit extreem domme code (en met een Reader Rating van 9.2
zou ik geen lezersbijdragen durven gebruiken van SitePoint) maar het
vervuilt mogelijk ook nog eens de database bij hackpogingen.

En ik heb geen idee of replace case-insensitive is en welke DB gebruikt
wordt, maar MySQL heeft geen moeten met SeLeCT, DRoP, DeLeTE en zo
vzviw.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Michiel de Roo
24/01/05, 11:55
John Bokma wrote:
> Joep wrote:
>
>
>>>>>Oh, ik ben het met 'm eens de code is ongelooflijk dom.
>>
>>Tja, ik vond de gedachte wel slim: alle gevaarlijke elementen
>>uitbannen maar goed....
>
>
> Dat is altijd fout, want dan moet je alle gevaarlijke elementen weten.
> Beter: maak een lijst van wat mag. Staat het niet in de lijst, dan is het
> een gevaarlijk element. Jij weet wat mag. Maar jij weet wellicht niet wat
> gevaarlijk is.

Dat is natuurlijk een mooie gedachte, en zeker te prefereren indien
mogelijk. Maar wat ga je doen als je variable gedefinieerd is als 'een
stuk tekst met html opmaak' ? Alle toegestane html elementen in een lijst
zetten ? Zou nog best kunnen, maar het gevaar kan ook in je attributes
zitten, onclick bijvoorbeeld. Die ook allemaal erin zetten ? Zelfs dan ben
je er nog niet helemaal waarschijnlijk, een href kan ook javascript
bevatten, maar die wil je niet helemaal uitbannen.

John Bokma
24/01/05, 20:05
Michiel de Roo wrote:

> John Bokma wrote:
>> Joep wrote:
>>
>>
>>>>>>Oh, ik ben het met 'm eens de code is ongelooflijk dom.
>>>
>>>Tja, ik vond de gedachte wel slim: alle gevaarlijke elementen
>>>uitbannen maar goed....
>>
>>
>> Dat is altijd fout, want dan moet je alle gevaarlijke elementen
>> weten. Beter: maak een lijst van wat mag. Staat het niet in de lijst,
>> dan is het een gevaarlijk element. Jij weet wat mag. Maar jij weet
>> wellicht niet wat gevaarlijk is.
>
> Dat is natuurlijk een mooie gedachte, en zeker te prefereren indien
> mogelijk. Maar wat ga je doen als je variable gedefinieerd is als 'een
> stuk tekst met html opmaak'

Als je dat direct in een stuk HTML gaat weergeven moet je daar zeer
zeker mee oppassen.

> ? Alle toegestane html elementen in een
> lijst zetten ?

Waarom niet? Hoeveel zijn dat er denk je? Sterker, je zal zelfs moeten
kijken of ze afgesloten zijn en zo, dus validatie. Je wil niet dat
iemand <h1>Whoehahaha kan ingeven, en dat de h1 lekker doorwerkt in de
rest van de pagina.

> Zou nog best kunnen, maar het gevaar kan ook in je
> attributes zitten, onclick bijvoorbeeld.

Je wilt zomaar ook JavaScript gaan toestaan? Ik vraag mij af hoeveel
mensen zo gek zijn :-D.

> Die ook allemaal erin zetten
> ?

En het probleem is? Sterker, denk je niet dat er mensen zijn die al
keurig dit voor je geschreven hebben? Ik hoop dat diverse message boards
inderdaad deze dingen controleren.

Ik gebruik er wel eens een, en die gebruiken bbcode. En dat is heel
beperkt, en ik herinner mij dat je daar gewoon een class voor kan
downloaden.

> Zelfs dan ben je er nog niet helemaal waarschijnlijk, een href kan
> ook javascript bevatten, maar die wil je niet helemaal uitbannen.

Omdat? Omdat je pop up venstertjes wilt maken? Als je dat zou willen,
wat let je om

<popup href="..."></popup> beschikbaar te maken?

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

Michiel de Roo
25/01/05, 13:25
John Bokma wrote:
> Michiel de Roo wrote:

>>Zou nog best kunnen, maar het gevaar kan ook in je
>>attributes zitten, onclick bijvoorbeeld.
>
> Je wilt zomaar ook JavaScript gaan toestaan? Ik vraag mij af hoeveel
> mensen zo gek zijn :-D.

Nee, dat wil je dus niet. Je wilt helemaal geen onClick e.d. toestaan.

>
>
>>Die ook allemaal erin zetten
>>?
>
>
> En het probleem is? Sterker, denk je niet dat er mensen zijn die al
> keurig dit voor je geschreven hebben? Ik hoop dat diverse message boards
> inderdaad deze dingen controleren.
>
> Ik gebruik er wel eens een, en die gebruiken bbcode. En dat is heel
> beperkt, en ik herinner mij dat je daar gewoon een class voor kan
> downloaden.

Dat is voor mij geen optie. Ik geef gebruikers bij voorkeur een grafische
editor álá htmlarea of anders gewoon een textarea. bbcode vind ik hopeloos
ouderwets. Ook gezien het grote aantal mensen dat wel een beetje html kent
vind ik het handiger om gelijk (beperkt) html toe te staan.

Overigens heeft Perl de class HTML::TagFilter, die ziet er aardig
bedrijfszeker uit.

>
>
>>Zelfs dan ben je er nog niet helemaal waarschijnlijk, een href kan
>>ook javascript bevatten, maar die wil je niet helemaal uitbannen.
>
>
> Omdat? Omdat je pop up venstertjes wilt maken? Als je dat zou willen,
> wat let je om
>
> <popup href="..."></popup> beschikbaar te maken?
>

De href wil je niet helemaal uitbannen, de javascript/vbscript erin juist
wél ;-) De meeste php scripts die ik zie gebruiken voor xss beveiliging
toch het uitsluit principe, maar je kunt je inderdaad afvragen of dat de
juiste weg is. Ik zal nog eens kijken of er wat kant en klaar is dat beter
werkt.

Een oplossing die beide implementeert kan natuurlijk ook nog. Als iemand
iets probeert te submitten met overduidelijk javascript of vbscript erin
dan kun je een nette melding geven dat dit niet mag en waarom. Voor de
rest haal je de code door het 'toegestane tag filter'.

John Bokma
25/01/05, 19:25
Michiel de Roo wrote:

> John Bokma wrote:
>> Michiel de Roo wrote:
>
>>>Zou nog best kunnen, maar het gevaar kan ook in je
>>>attributes zitten, onclick bijvoorbeeld.
>>
>> Je wilt zomaar ook JavaScript gaan toestaan? Ik vraag mij af hoeveel
>> mensen zo gek zijn :-D.
>
> Nee, dat wil je dus niet. Je wilt helemaal geen onClick e.d. toestaan.

Ah, gelukkig :-D

>> Ik gebruik er wel eens een, en die gebruiken bbcode. En dat is heel
>> beperkt, en ik herinner mij dat je daar gewoon een class voor kan
>> downloaden.
>
> Dat is voor mij geen optie. Ik geef gebruikers bij voorkeur een
> grafische editor álá htmlarea of anders gewoon een textarea.

Bij mij hangt dat van de gebruikers af :-D.

> bbcode
> vind ik hopeloos ouderwets.

Voor veel mensen is het eenvoudiger te begrijpen dan HTML (echt waar).

> Ook gezien het grote aantal mensen dat wel
> een beetje html kent

Uit mijn kennissenkring zijn dat er wellicht 3.

> vind ik het handiger om gelijk (beperkt) html toe
> te staan.
>
> Overigens heeft Perl de class HTML::TagFilter, die ziet er aardig
> bedrijfszeker uit.

Niet naar gekeken, zal 'm onthouden, bedankt.

>>>Zelfs dan ben je er nog niet helemaal waarschijnlijk, een href kan
>>>ook javascript bevatten, maar die wil je niet helemaal uitbannen.
>>
>> Omdat? Omdat je pop up venstertjes wilt maken? Als je dat zou willen,
>> wat let je om
>>
>> <popup href="..."></popup> beschikbaar te maken?
>>
>
> De href wil je niet helemaal uitbannen, de javascript/vbscript erin
> juist wél ;-)

Ah, ok. Ik las dat je bepaalde JavaScript dingen wel wilde toestaan :-D.

> De meeste php scripts die ik zie gebruiken voor xss
> beveiliging toch het uitsluit principe, maar je kunt je inderdaad
> afvragen of dat de juiste weg is. Ik zal nog eens kijken of er wat
> kant en klaar is dat beter werkt.

Met een href zou ik zeggen: het moet of beginnen met http:// of een
geldige relatieve URL zijn. Wellicht dat in Perl de URI class te
gebruiken is om dit goed af te handelen. (URL er in, evt. absoluut
maken, controleren of die valide is, en het scheme http is).

> Een oplossing die beide implementeert kan natuurlijk ook nog. Als
> iemand iets probeert te submitten met overduidelijk javascript of
> vbscript erin dan kun je een nette melding geven dat dit niet mag en
> waarom. Voor de rest haal je de code door het 'toegestane tag filter'.

Klinkt stukken beter. Ik weet dat het een berg werk is, maar het
voorkomt nare verassingen van de vorm: ai, nieuwe exploit.

--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html