Hallo,
Ik heb even een vraagje voor een nieuwssysteem, zoals iedereen dat zo vaak maakt, in allerlei soorten en maten. Je moet hierin berichten kunnen plaatsen, bewerken verwijderen etc. Ik heb het met php en mysql opgezet en opzich draait het allemaal goed, alleen vraag ik me af of ik nu overal aan heb gedacht m.b.t. hoe ik data opsla en met betrekking tot de veiligheid van mijn scripts. Ik zit namelijk af en toe een beetje te rommelen tussen de functies strip_tags() htmlspecialchars nl2br() en str_replace() voor bepaalde tekens die de weergave kunnen verpesten (zoals " of '). Ook zat ik eerst nog te rommelen met de slashes (add & stripslashes). Op heel veel punten zie je wel uitleg, maar nergens alles lekker bij elkaar...
Ik heb magic quotes runtime en gpc op 0 (uit dus) gezet, en doe alleen addslashes() als gegevens de database in gaan of als ze bewerkt worden en in bewerkte vorm weer opgeslagen worden in de db. Voor de rest doe ik niets met addslashes of stripslashes. Ik neem aan dat dat voldoende is, of is er iets wat ik nu over het hoofd zie?
str_replace(): ik vroeg me af welke tekens allemaal schadelijk zijn. Ik heb nu str_replace gedaan voor de tekens ' en ".
En wat ik dan doe is dmv str_replace ervoor zorgen dat bij formulieren met meer stappen, de single en double quotes (' en ") vervangen worden door html tekens ( & q u o t ; en zo (zonder de spaties, maar k weet niet hoe ik t anders moet weergeven...). (als ik dat niet doe, krijg je halve strings die opgeslagen worden in de db. Zie bijvoorbeeld het volgende:
In dit voorbeeld wordt het woord 'hebt' niet opgeslagen. Als ik het spul dan weer in de db opsla (bij een INSERT of bij een UPDATE) doe ik het omgekeerde, zodat de " en ' wel echt worden opgeslagen in de db (en dmv addslashes komt dat goed).
Verder gebruik ik in de weergave nog str_replace voor < > als ik htmlspecialchars niet kan gebruiken. Volgens mij kun je htmlspecialchars() niet gebruiken als je iets op het scherm wilt printen dat uit een textarea komt, waarin ook newlines opgeslagen zijn. Je hebt dan nl2br() nodig om de newlines ook weer te geven, maar htmlspecialchars maakt het specialchars van waardoor de enters niet geprint worden en de tekst dus achter elkaar doorloopt...
Stel in $record['tekst'] staat de tekst uit een textarea met enters erin, dan doe je: echo nl2br($record['tekst']); voor de juiste weergave. Als ik er dan htmlspecialchars in wil verwerken, dan lukt me dat niet. Dan wordt het namelijk echo htmlspecialchars(nl2br($record['tekst'])); wat betekent dat de gemaakte enters, door htmlspecialchars niet doorkomen. Doe je de functie op een andere plek: nl2br(htmlspecialchars($record['tekst'])) dan gaat het volgens mij ook niet goed, want htmlspecialchars maakt van \n, allemaal specialchars, waardoor nl2br niets te vervangen heeft.
Dus de vraag is hoe je nu het beste info uit een textarea (uit een db) kunt weergeven. Moet je dan htmlspecialchars weglaten en het anders oplossen? En hoe precies?
Dmv strip_tags() icm str_replace voor ' " < >?
Of zijn er nog meer zaken waar ik aan moet denken?
Graag zou ik willen weten of ik overal aan heb gedacht bij het verwerken van de input die ik uit formulieren in de database stop en weer weergeef. Ik heb namelijk net een artikel gelezen op phpfreakz (hacking guide) waarin wordt gezegd dat hierin veel fouten gemaakt worden, waardoor gevoelige info gemakkelijk weergegeven kan worden. Dat is nou niet echt mijn bedoeling...
Alvast bedankt voor uw op- en aanmerkingen...
Ik heb even een vraagje voor een nieuwssysteem, zoals iedereen dat zo vaak maakt, in allerlei soorten en maten. Je moet hierin berichten kunnen plaatsen, bewerken verwijderen etc. Ik heb het met php en mysql opgezet en opzich draait het allemaal goed, alleen vraag ik me af of ik nu overal aan heb gedacht m.b.t. hoe ik data opsla en met betrekking tot de veiligheid van mijn scripts. Ik zit namelijk af en toe een beetje te rommelen tussen de functies strip_tags() htmlspecialchars nl2br() en str_replace() voor bepaalde tekens die de weergave kunnen verpesten (zoals " of '). Ook zat ik eerst nog te rommelen met de slashes (add & stripslashes). Op heel veel punten zie je wel uitleg, maar nergens alles lekker bij elkaar...
Ik heb magic quotes runtime en gpc op 0 (uit dus) gezet, en doe alleen addslashes() als gegevens de database in gaan of als ze bewerkt worden en in bewerkte vorm weer opgeslagen worden in de db. Voor de rest doe ik niets met addslashes of stripslashes. Ik neem aan dat dat voldoende is, of is er iets wat ik nu over het hoofd zie?
str_replace(): ik vroeg me af welke tekens allemaal schadelijk zijn. Ik heb nu str_replace gedaan voor de tekens ' en ".
En wat ik dan doe is dmv str_replace ervoor zorgen dat bij formulieren met meer stappen, de single en double quotes (' en ") vervangen worden door html tekens ( & q u o t ; en zo (zonder de spaties, maar k weet niet hoe ik t anders moet weergeven...). (als ik dat niet doe, krijg je halve strings die opgeslagen worden in de db. Zie bijvoorbeeld het volgende:
PHP:
1
2
3
4
| <?$tekst='blaatmetdubbelequoteskijkmaar:"hebt" blablabla'; //tekst komt uit de database ?> <input type="hidden" value="<?echo $tekst;?>"> |
In dit voorbeeld wordt het woord 'hebt' niet opgeslagen. Als ik het spul dan weer in de db opsla (bij een INSERT of bij een UPDATE) doe ik het omgekeerde, zodat de " en ' wel echt worden opgeslagen in de db (en dmv addslashes komt dat goed).
Verder gebruik ik in de weergave nog str_replace voor < > als ik htmlspecialchars niet kan gebruiken. Volgens mij kun je htmlspecialchars() niet gebruiken als je iets op het scherm wilt printen dat uit een textarea komt, waarin ook newlines opgeslagen zijn. Je hebt dan nl2br() nodig om de newlines ook weer te geven, maar htmlspecialchars maakt het specialchars van waardoor de enters niet geprint worden en de tekst dus achter elkaar doorloopt...
Stel in $record['tekst'] staat de tekst uit een textarea met enters erin, dan doe je: echo nl2br($record['tekst']); voor de juiste weergave. Als ik er dan htmlspecialchars in wil verwerken, dan lukt me dat niet. Dan wordt het namelijk echo htmlspecialchars(nl2br($record['tekst'])); wat betekent dat de gemaakte enters, door htmlspecialchars niet doorkomen. Doe je de functie op een andere plek: nl2br(htmlspecialchars($record['tekst'])) dan gaat het volgens mij ook niet goed, want htmlspecialchars maakt van \n, allemaal specialchars, waardoor nl2br niets te vervangen heeft.
Dus de vraag is hoe je nu het beste info uit een textarea (uit een db) kunt weergeven. Moet je dan htmlspecialchars weglaten en het anders oplossen? En hoe precies?
Dmv strip_tags() icm str_replace voor ' " < >?
Of zijn er nog meer zaken waar ik aan moet denken?
Graag zou ik willen weten of ik overal aan heb gedacht bij het verwerken van de input die ik uit formulieren in de database stop en weer weergeef. Ik heb namelijk net een artikel gelezen op phpfreakz (hacking guide) waarin wordt gezegd dat hierin veel fouten gemaakt worden, waardoor gevoelige info gemakkelijk weergegeven kan worden. Dat is nou niet echt mijn bedoeling...
Alvast bedankt voor uw op- en aanmerkingen...
[ Voor 22% gewijzigd door Verwijderd op 23-08-2004 14:57 ]