Hoe beveilig je querys ?
ik ben aan dus nog steeds aan een klein cms'je bezig, maar heb van iemand te horen gekregen, dat zo'n querys niet veilig zijn:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php if(isset($_GET['bandid'])) {
$bandid = $_GET['bandid'];
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}
?>
$bandid = $_GET['bandid'];
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}
?>
Nu zou ik liever hebben dat mijn site niet dagelijks wordt gehackt. Dus zou iemand mij kunnen zeggen hoe ik querys beveilig ?
Ik ben nog maar een beginner, dus de makkelijkste weg, krijgt de voorkeur :p
Bij voorbaat dank!
Waarom controleer je niet of de query is gelukt? Die kan namelijk altijd mislukken en zal vroeg of laat ook mislukken. Check dus of $lyricslist TRUE of FALSE is, dan weet je of de query is gelukt of juist is mislukt.
Dan wat anders, namen als $lyricslist en $lyrics hebben niet mijn voorkeur. Dit betreffen namelijk een result-set en een row uit de result-set. $result en $row liggen volgens mij dan voor de hand. Zorg er in elk geval voor dat je een bewuste keuze maakt die op al jouw scripts wordt toegepast, ook als het niet gaat om lyrics.
Bedankt voor het antwoorden.
Ik veronderstel dat ik die is_nummeric zo moet gebruiken ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if(isset($_GET['bandid'])) {
$bandid = $_GET['bandid'];
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
if(isset($_GET['bandid'])) {
$bandid = $_GET['bandid'];
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand ='$bandid' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
Ik snap niet wat je bedoelt met mysql_real_escape_string() .
Ik weet ook niet hoe te kijken of ^lyricslist TRUE of FALSE is.
Zou je hiervan een voorbeeld willen geven ?
Wat de namen betreft, heb ik er niet echt bij nagedacht (van de vars). IK heb ze gewoon zo genoemd om ze te kunnen herkennen.
Bij voorbaat dank!
Gewijzigd op 01/01/1970 01:00:00 door Altin
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
// eerste deel van je code, en dan:
if($lyricslist){ // TRUE, query is gelukt
// zet de output op het scherm, zie je huidige code
}
else { // FALSE
echo 'Mislukt vanwege de volgende fout: '.mysql_error();
}
?>
// eerste deel van je code, en dan:
if($lyricslist){ // TRUE, query is gelukt
// zet de output op het scherm, zie je huidige code
}
else { // FALSE
echo 'Mislukt vanwege de volgende fout: '.mysql_error();
}
?>
Met mysql_real_escape_string() voorkom je dat er ongewenste quotes e.d. in de query terecht kunnen komen. Deze kunnen als SQL-injection bedoelt zijn, maar ook de query laten mislukken. Zie verder de php-handleiding.
En niet nadenken over de namen voor de variabelen? Dat gaat vroeg of laat problemen opleveren, hier een paar voorbeelden:
$sVoornaam: string waar een voornaam in staat
$aVoornaam: array waar voornamen in staan
$iHuisnummer: integer wat een huisnummer voorstelt
$query: stuk SQL
$result: resultaat van een query
$row: rij uit het resultaat van een query
Met de s, a en i geef je dus ook aan van welk type de data is. Een string, array of integer. Er zijn nog meer types, dat mag je zelf uitzoeken.
bedankt voor de les :)
Gewijzigd op 01/01/1970 01:00:00 door Altin
I snap hier maar weinig van :$ http://be2.php.net/mysql_real_escape_string
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$id = 423432;
$sQuery = 'SELECT * FROM tabel WHERE id = \'' . mysql_real_escape_string($id) . '\'';
?>
$id = 423432;
$sQuery = 'SELECT * FROM tabel WHERE id = \'' . mysql_real_escape_string($id) . '\'';
?>
Voor mysql_real_escape_string heb je dus wel een verbinding nodig met de database, anders zal deze functie een E_WARNING error genereren.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$id = 423432;
$sQuery = "SELECT * FROM tabel WHERE id = '" . mysql_real_escape_string($id) . '"';
?>
$id = 423432;
$sQuery = "SELECT * FROM tabel WHERE id = '" . mysql_real_escape_string($id) . '"';
?>
Ik gebruik alleen "..." als het ook echt nodig is. Dus als je bijvoorbeeld een enter (\n) wil hebben. Meestal wil je dat een string letterlijk door PHP wordt opgenomen.
Maar net wat je zegt het is maar wat je prettig / makkelijk / beter vind.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if(isset($_GET['bandid'])) {
$bandid = $_GET['bandid'];
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". mysql_real_escape_string($bandid) . " ' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
if(isset($_GET['bandid'])) {
$bandid = $_GET['bandid'];
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". mysql_real_escape_string($bandid) . " ' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
Ah ok bedankt.
Dus bovenstaande code is perfect veilig ?
(er is een db verbinding trouwes :p)
Gewijzigd op 01/01/1970 01:00:00 door Altin
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if(isset($_GET['bandid'])) {
$bandid = mysql_real_escape_string($_GET['bandid']);
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". $bandid . " ' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
if(isset($_GET['bandid'])) {
$bandid = mysql_real_escape_string($_GET['bandid']);
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". $bandid . " ' ");
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
echo "</ul>";
}else {
echo "Invalid Band!";
}
}
?>
en dus ook nog steeds veilig ?
Het lijkt me in ieder geval makkelijker :p
thanks!
Dat maakt inderdaad voor de veiligheid niets uit, en als je het gemakkelijker vind werken, zou ik het gewoon op deze manier doen.
En wat is hier het doel van:
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
? Dit kost alleen maar extra geheugen en levert verder geen enkel voordeel op. Gebruik dus gewoon $lyrics["id"] e.d. wanneer je deze waarde wilt echoen.
Verder ontbreekt nog steeds de controle of de query wel is gelukt. Dat gaat problemen opleveren!
Zou idd veel makkelijker zijn.
En klopt het nu de manier waaropik kijk of de query is gelukt ?
Of moet ik die if elders plaatsen ?
BEdankt ! :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php if(isset($_GET['bandid'])) {
$bandid = mysql_real_escape_string($_GET['bandid']);
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". $bandid . " ' ");
if($lyricslist){
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
}
echo "</ul>";
}else {
echo "failed: " .mysql_error();
}
}else {
echo "Invalid Band!";
}
}
?>
$bandid = mysql_real_escape_string($_GET['bandid']);
if (is_numeric($bandid)){
$lyricslist = mysql_query("SELECT lyricsTitle, id FROM lyrics WHERE lyricsBand =' ". $bandid . " ' ");
if($lyricslist){
echo "<ul>";
while ($lyrics = mysql_fetch_array($lyricslist)) {
$lyricsTitle = $lyrics["lyricsTitle"];
$lyricsID = $lyrics["id"];
echo "<li><a href=\"?lricsID=" .$lyricsID. "\">" .$lyricsTitle. "</a></li>\n";
}
}
echo "</ul>";
}else {
echo "failed: " .mysql_error();
}
}else {
echo "Invalid Band!";
}
}
?>