Mysql Injection

Door Dbr Br, 23 jaar geleden, 32.485x bekeken

Een uitleg over het fenomeen SQL injection en wat je ertegen kunt doen

Gesponsorde koppelingen

Inhoudsopgave

  1. Inleiding
  2. Hoe gaat SQL-Injection te werk?
  3. SQL-Injection in de Where-clause
  4. Hoe kun je dit tegengaan?

 

Er zijn 37 reacties op 'Overig'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Han eev
Han eev
23 jaar geleden
 
0 +1 -0 -1
perfecte tut
dit moet iedereen weten
ik had er wel een stuk overgelezen op phpfreaks maar dit is echt top
DaeDaluz
DaeDaluz
23 jaar geleden
 
0 +1 -0 -1
Nice tut! is erg handig om voor op te passen :)
Winston Smith
Winston Smith
23 jaar geleden
 
0 +1 -0 -1
Goed uitgelegd! Alleen gebruik je op pagina 3 de variabelen username, name_user en naam_user; volgens mij zouden die alle 3 gelijk moeten zijn ;)
Dbr Br
Dbr Br
23 jaar geleden
 
0 +1 -0 -1
Inderdaad. Zelf niet eens opgemerkt :P
Bedankt!
Bram Z
Bram Z
23 jaar geleden
 
0 +1 -0 -1
het teken ' word zoiezo toch door \' vervangen dus kan dat niet van dit ');
Dbr Br
Dbr Br
23 jaar geleden
 
0 +1 -0 -1
Alleen is het hier geen ' maar %27,
ik zou zeggen probeer het eens uit ;)
Olaf Lederer
Olaf Lederer
23 jaar geleden
 
0 +1 -0 -1
Ik vind dit wel heel veer gezocht....

Natuurlijk is data die ingevoerd wordt te valideren.


23 jaar geleden
 
0 +1 -0 -1
vergezocht??? weet je wel waar je het over hebt? dit zijn nog maar simpele voorbeelden, maar vul dit maar eens in bij een niet beveiligd inlog systeem:
als user : admin
als pass: ' or 1=1--
ja inderdaad, je bent nu als admin ingelogd. vergezocht, he?

goede tut!!! goed gedaan dave!

huib
Dbr Br
Dbr Br
23 jaar geleden
 
0 +1 -0 -1
Dankje.
Klopt wat je zegt huib, de voorbeelden die ik geef heb ik zo goed mogelijk versimpeld, anders is het niet om bij te houden denk ik.
St.Chessere
St.Chessere
23 jaar geleden
 
0 +1 -0 -1
Mysql injections zoals jij ze beschrijft is achterhaald. behalve op oude systemen dan. Maar er is nog wel een manier waarop he soms kan werken en dat is een integer die niet tussen de ' ' word geplaatst.


23 jaar geleden
 
0 +1 -0 -1
thnx! dit zal mijn site goed helpen tegen hackers!!!


23 jaar geleden
 
0 +1 -0 -1
Leuke tut maar ik doe het zo:
$username_login = addslashes(htmlspecialchars($username_login));
je gaat nu op 2 manieren sql injection bestrijden...
je kan hier natuurlijk een functie voor schrijven zodat het korter wordt.
Dit zou er dan zo uit zien:
(asqlinj staat voor anti sql injection gewoon ff verzonnen)
function asqlinj($text)
{
$text = addslashes(htmlspecialchars($text));
return $text ;
}
In het php script zelf dan zo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$username
= asqlinj($username);
?>

en hierna invoeren in de database....
laat sql injector mannetjes maar komen :P


23 jaar geleden
 
0 +1 -0 -1
Als je dan ook nog eens een replace doet op ; dan waant is het helemaal goed.

Voorbeeld:
SELECT * FROM users WHERE naam='$naam'
Ik geef mee
webmakerij'; DELETE FROM users WHERE naam != '
De uitgevoerde query zal worden
SELECT * FROM users WHERE naam='webmakerij'; DELETE FROM users WHERE naam != ''


23 jaar geleden
 
0 +1 -0 -1
zwakke tutorial vind ik zelf:
check deze eens;)
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
of die op phpfreakz


23 jaar geleden
 
0 +1 -0 -1
Als ik me niet vergis weigert php meerdere query's (gescheiden met een ; ) uit te voeren...dus een replace ; zou dan niet nodig zijn.


23 jaar geleden
 
0 +1 -0 -1
Leuk en aardig dat jullie zo'n tut online zetten, want ben op zoek naar
manier om mijn database te beveiligen......

MAAR:
Stel IK ben een Pietje (die eerst niks niks van hacks af wist) dan ben ik na het lezen van deze tut?

Juist, kwaadaardige Pietje die nu over de mogelijkheid beschikt om een database -site die niet beveiligd is te hacken.....


23 jaar geleden
 
0 +1 -0 -1
Kennis is overal te krijgen, dus wat jij zecht is nutteloos. Een beetje nadenken en je vind het zelf uit.

Overigens goede tut, was ernaar opzoek. Mogelijk is deze heel kort, maar zeker wel duidelijk :)
Frank
Frank
23 jaar geleden
 
0 +1 -0 -1
@Masterik: Je bent op zoek naar een manier om de database te beveiligen, deze tut laat zien waar de veiligheidslekken zitten, dan kun jij hier toch actie op ondernemen?

Als je niet weet waar de lekken zitten, dan wordt het ook verdraaid lastig om hier iets tegen te doen. Hacken kun je ook op je eigen database/website gaan doen om vast te stellen of je tegen bepaalde aanvallen bestand bent. Als je niet weet hoe je een (eenvoudige) hack moet toepassen, dan kun je de gebouwde oplossing ook nooit testen...

Ik vind het een raar verwijt dat je nu richting de schrijver (Dave) en PHPHulp maakt.


23 jaar geleden
 
0 +1 -0 -1
Ja, inderdaad is dat Pietje-verhaal van Masterik onzin... wie zorgt er nou voor een veilige database: de beheerder van de database of de hacker?


23 jaar geleden
 
0 +1 -0 -1
'eee


23 jaar geleden
 
0 +1 -0 -1
volgens mij probeerde de kerele hierboven zelf een injection in te voeren lol.
Geweldige tut trouwens :) veel aan gehad, heel goed uitgelegd.


23 jaar geleden
 
0 +1 -0 -1
Moet je deze code boven onder <php-------------?>
Zetten?


23 jaar geleden
 
0 +1 -0 -1
dit moet tussen een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php code en een ?>
code...


23 jaar geleden
 
0 +1 -0 -1
@guevara: functies kan je het beste bovenaan de code defineeren

@dave: mooie tutorial, wist ik nog niet. maar als er een getal ingevoerd moet worden(index.php?act=foo&id=6) zou je dit kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if (empty($_GET['id']) && is_numeric($_GET['id'])) {
$sql = "SELECT * FROM `movies` WHERE `id` = '".$_GET['id']."';";
// bij id is 8 krijgt $sql de waarde:
// SELECT * FROM `movies` WHERE `id` = '8';

// bij id = sukkel krijgt sql geen waarde, omdat sql dan niet bestaat


///blalblalbal: query uitvoeren enzovoort


} else {
print 'Hacker!!!';
}
?>
- SanThe -
- SanThe -
23 jaar geleden
 
0 +1 -0 -1
@Sebastiaan: if (empty($_GET['id']) && is_numeric($_GET['id'])) {
moet dat niet if (!empty($_GET['id']) && is_numeric($_GET['id'])) {
zijn (NOT emptie).


23 jaar geleden
 
0 +1 -0 -1
Oeps. Typfout.
Dbr Br
Dbr Br
23 jaar geleden
 
0 +1 -0 -1
Dat kan inderdaad ja, en dit probeer ik met dit artikel duidelijk te maken.. Honderden variaties erop zijn natuurlijk mogenlijk.


23 jaar geleden
 
0 +1 -0 -1
Maar toch, je moet het echt goed kunnen en echt 'evil' zijn om het te doen. Is sqlinjection ook mogelijk via $_POST?


22 jaar geleden
 
0 +1 -0 -1
hoi,

moet de $value de dierekte mysql_query zijn of ook bv mysql_result ?
en als je het dan met 1 vd 2 doet kan je dan bv gewoon:
$value = mysql_query(); zijn ?
Dbr Br
Dbr Br
22 jaar geleden
 
0 +1 -0 -1
@Sabastiaan: je moet het maar zo bekijken: alle gegevens die vanaf een gebruiker komen kunnen sql-injection bevatten, zo ook bijvoorbeeld COOKIES en dus ook POST ja.

@Psychotic: Ik snap je vraag niet helemaal.


22 jaar geleden
 
0 +1 -0 -1
bij dat functie moet je daar $value veranderen??
Herman Buurlage
Herman Buurlage
19 jaar geleden
 
0 +1 -0 -1
Ik vraag me af of dit ook te beveilligen is met arrays?

Ik heb namelijk boven aan mijn pagina de arrays van pagina's staan die alleen kunnen worden geladen in mijn site.
Graag zou ik willen weten of dit ook werkt aangezien mijn script niet voorzien is van 1 van deze beveiligingen.
Emmanuel Delay
Emmanuel Delay
19 jaar geleden
 
0 +1 -0 -1
Zeg, bv. voor een inlogscript: als je je paswoord door md5 haalt, is je query toch sowieso beschermd, of vergeet ik iets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
$sql
= 'SELECT *
FROM user
WHERE ( username ="'
. $login .'" )
AND ( password="'
. md5($pass) .'" )
LIMIT 1;'
;
?>
Douwe
Douwe
19 jaar geleden
 
0 +1 -0 -1
md5() geeft altijd een string bestaande uit de letters a-f, en de cijfers 0-9 terug, dat is dus veilig voor een query.
Terence Hersbach
Terence Hersbach
19 jaar geleden
 
0 +1 -0 -1
maar een md5 string is vaak makkelijk te kraken als iemand 4 tekens gebruikt. Je kan het beste daar zelf nog een string aan toevoegen: (dat moet je dan ook overal doen)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$sql
= 'SELECT *
FROM user
WHERE ( username ="'
. $login .'" )
AND ( password="'
. md5($pass.'voorbeeldVanEenZandZodatHetWachtwoordVeiligWordt') .'" )
LIMIT 1;'
;
?>
Emmanuel Delay
Emmanuel Delay
19 jaar geleden
 
0 +1 -0 -1
Als je toelaat dat mensen kunnen registreren met simpele paswoorden, maak je het de hackers inderdaad gemakkelijker.

Minimum 6 karakters, camel caps, een cijfer in het midden van het paswoord, ... Dat maakt al een wereld van verschil.

Mij ging het vooral om de vraag of er nog sql injection mogelijk is.

Verder denk ik ook dat je best zoveel mogeleijk een select doet en zoekt op een numerieke id, buiten dus login. Dan controleer je gemakkelijk met bv.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
if ($boek > 0)
  ...

?>
Ook geen injection meer mogelijk.

Ronde haakjes gebruiken bij OR en AND zal ook al veel doen. Dat vermijdt dubbelzinnigheid.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
19 jaar geleden
 
0 +1 -0 -1
Je kan in principe met AJAX/ of JS alleen ook aangeven of een wachtwoord sterk is of niet. Dit gebeurt al bij meerdere sites waarbij je je moet registreren.

Rood schrikt af en als je input veld bij het wachtwoord rood is, omdat je wachtwoord zwak is, zal dat een aantal mensen wel aan het denken/ werken zetten om een beter wachtwoord te bedenken.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Inleiding
  2. Hoe gaat SQL-Injection te werk?
  3. SQL-Injection in de Where-clause
  4. Hoe kun je dit tegengaan?

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.