[TYPO3-UG Dutch] sqlinjection

Jigal van Hemert jigal at xs4all.nl
Wed Oct 12 21:04:39 CEST 2011


Hoi,

On 12-10-2011 17:21, W.S.M. Perquin [YniVerse] wrote:
> Iemand enig idee hoe dat ding dat doet? Cq hoe ik dat ook kan blokken?

Hoe die hack-pogingen precies gaan hoef je niet eens te weten om te 
kunnen voorkomen dat ze effect hebben.

Het belangrijkste is dat je argwanend (of paranoia) gaat worden over 
*alle* data "van buiten". De term "van buiten" moet je erg ruim nemen, 
data uit:
- URL parameters
- databases
- bestanden
- POST parameters
- externe bronnen
- gebruikersinvoer
- etc.
Kortom, alles wat je script niet zelf van de grond af aan heeft opgebouwd.

Als je dit soort data in een query wilt stoppen zijn er twee manieren om 
het te beveiligen:
- het zijn gehele getallen: gebruik de PHP functie intval() om er een 
integer van te maken
- anders: gebruik de TYPO3 functie $quotedVariable = 
$GLOBALS['TYPO3_DB']->fullQuoteStr($variable, $tableName); Dit is een 
functie die bij elke database werkt via de DBAL extensie.

Een aantal TYPO3 database functies zal zelf de data al escapen en 
quoten. Dit kun je in de API documentatie nalezen.
Als je voor versie 4.5 of hoger ontwikkelt dan kan het de moeite waard 
zijn om eens naar prepared statements te kijken [1]. Deze beveiligen de 
data zelf en kunnen bovendien voor snelheidswinst zorgen op andere 
database-systemen.

Uitvoer
-------

Ook aan de uitvoer van data moet aandacht besteed worden. Het grootste 
probleem is dat er HTML code met onaardige bedoelingen in data is 
terechtgekomen en dat deze zonder controle aan bezoekers wordt aangeboden.

Als je geen HTML in de data verwacht is het in feite genoeg om iets als
   echo htmlspecialchars($data);
te doen.
Als je wel HTML wilt toestaan wordt het complexer. De functie
t3lib_div::removeXSS($data) neutraliseert potentieel gevaarlijke tags en 
attributen. Dit gebeurt door er '<x>' in te voegen (een <script...> tag 
verandert dan in <sc<x>ript> ). Om nog valide HTML uit te spugen zou je 
iets kunnen gebruiken zoals:

if ($data === t3lib_div::removeXSS($data)) {
     // geen XSS gevonden, dus waarschijnlijk 'veilig'
   echo $data;
} else {
     // verwijder veiligheidshalve alle tags
   echo strip_tags($data);
}

(strip_tags() is niet perfect, maar het zal wel schone data opleveren)

[1] 
http://buzz.typo3.org/teams/core/article/typo3-45-lts-prepared-queries-are-the-way-to-go/


-- 
Kind regards / met vriendelijke groet,

Jigal van Hemert.


More information about the TYPO3-UG-Dutch mailing list