webForumDet fria alternativet

Säkerhet i mySQL?

PHP

39 svar · 3 790 visningar · startad av alioooop · sida 2 av 2

Frågan, av alioooop

hej håller på att försöka få min sida säker men hittar så många olika sätt men alla har sina negativa sidor. då är min fråga, vad ska jag använda mig utav för funktion eller om jag ska skriva en ultimat egen funktion, hur ska den se ut? såg även att vissa har &-tecken runt sina variabler som ska in i databasen, vad ger detta? frågan har säkert ställts tusen ggr förr men hittade inte ett bra sva

Läs frågan i sin helhet →
Medlem sedan feb. 2008120 inlägg
#21

jme skrev:

Jag rekommenderar också PDO.

okej, behöver man använda sig utav mysql_real_escape_string() för att få det säkert när man gör en PDO? =)

Medlem sedan juni 20014 421 inlägg
#22

alioooop skrev:

okej, behöver man använda sig utav mysql_real_escape_string() för att få det säkert när man gör en PDO? =)

Inte om du använder prepared statements. Använder du däremot $pdo->exec("FANCY SQL MED DATA FRÅN ANVÄNDAREN"); är det ingen skillnad mot att göra en mysql_query("FANCY SQL MED DATA FRÅN ANVÄNDAREN"); och då måste du escapea datan.

Medlem sedan feb. 2008120 inlägg
#23

colione skrev:

Inte om du använder prepared statements. Använder du däremot $pdo->exec("FANCY SQL MED DATA FRÅN ANVÄNDAREN"); är det ingen skillnad mot att göra en mysql_query("FANCY SQL MED DATA FRÅN ANVÄNDAREN"); och då måste du escapea datan.

okej, vad är det som gör prepared statment säkrare? :) vad skulle hända om jag skriver in sträng som skulle normalt få min databas förstörd? dvs SQL injection =)

Medlem sedan maj 20012 237 inlägg
#24

alioooop skrev:

okej, behöver man använda sig utav mysql_real_escape_string() för att få det säkert när man gör en PDO? =)

Ja det beror ju på om du kör med prepared statements eller SQL rakt av.

$db = new PDO(...);

// inte skyddad, även om PDO används
$db->query('SELECT * FROM user WHERE user_id = ' . $_GET['user_id']);

// Säker!
$db->query('SELECT * FROM user WHERE user_id ' . $db->quote($_GET['user_id']) );
Medlem sedan maj 20012 237 inlägg
#25

alioooop skrev:

okej, vad är det som gör prepared statment säkrare? :) vad skulle hända om jag skriver in sträng som skulle normalt få min databas förstörd? dvs SQL injection =)

http://fi2.php.net/pdo.prepared-statements

säger bl a följande:

"The parameters to prepared statements don't need to be quoted; the driver automatically handles this. If an application exclusively uses prepared statements, the developer can be sure that no SQL injection will occur (however, if other portions of the query are being built up with unescaped input, SQL injection is still possible). "

Medlem sedan feb. 2008120 inlägg
#26

jme skrev:

Ja det beror ju på om du kör med prepared statements eller SQL rakt av.

$db = new PDO(...);

// inte skyddad, även om PDO används
$db->query('SELECT * FROM user WHERE user_id = ' . $_GET['user_id']);

// Säker!
$db->query('SELECT * FROM user WHERE user_id ' . $db->quote($_GET['user_id']) );
<?php
// configuration
$dbtype		= "sqlite";
$dbhost 	= "localhost";
$dbname		= "test";
$dbuser		= "root";
$dbpass		= "admin";

// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

// new data
$title = '$_GET['title']';
$author = 'Jack Hijack';

// query
$sql = "INSERT INTO books (title,author) VALUES (:title,:author)";
$q = $conn->prepare($sql);
$q->execute(array(':author'=>$author,
                  ':title'=>$title));

?>

om man använder sig utav denna metod, är det där säkert? eller måste man använda sig utav $db->quote($_GET['title'])?

Medlem sedan maj 20012 237 inlägg
#27

Ja, det är säkert.

Medlem sedan juni 20014 421 inlägg
#28

Det är säkert. Inget behov av att använda $db->quote.

Finns dock inget behov av att sätta $dbtype till sqlite om du inte tänkte använda variablen. Speciellt inte som du connectar till databasen med en uri (mysql://). :p

Medlem sedan feb. 2008120 inlägg
#29

tack för all er hjälp :D alla på detta forum är alltid så hjälpsamma =)

Medlem sedan maj 20012 237 inlägg
#30

Det var så lite så :)

Glöm inte, att det är bra att validera användarens input redan innan den ens når databasfunktionerna. T ex vid formulärvalidering.

Medlem sedan feb. 2008120 inlägg
#31

jme skrev:

Det var så lite så :)

Glöm inte, att det är bra att validera användarens input redan innan den ens når databasfunktionerna. T ex vid formulärvalidering.

joo det är klart men om jag väntar mig en sträng så kan jag väl inte validera så ag vet att strängen inte innehåller något som förstör min databas? =)

Medlem sedan maj 20012 237 inlägg
#32

Nej. Vad jag menar är att om användaren har skrivit "pekka" i fältet för ålder så är det rimligt att signalera det som ett fel. Ingen idé att låta database-lagret säga "nej", alternativt konvertrera "pekka" till 0 eller liknande.

Medlem sedan feb. 2008120 inlägg
#33

jme skrev:

Nej. Vad jag menar är att om användaren har skrivit "pekka" i fältet för ålder så är det rimligt att signalera det som ett fel. Ingen idé att låta database-lagret säga "nej", alternativt konvertrera "pekka" till 0 eller liknande.

okej men det gör jag redan :) har live validering

Medlem sedan maj 20012 237 inlägg
#34

alioooop skrev:

okej men det gör jag redan :) har live validering

Live validering? låter som javascript-baserat? Js-baserad validering är ok SÅ LÄNGE validerings görs även på serversidan...

Medlem sedan feb. 2008120 inlägg
#35

oo men det gör jag också =) men tack för tipset

Medlem sedan feb. 2008120 inlägg
#36

hej igen :)

hur tar man ut alla celler från tabellen?

<?php
// configuration
$dbtype		= "sqlite";
$dbhost 	= "localhost";
$dbname		= "test";
$dbuser		= "root";
$dbpass		= "admin";

// database connection
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

$title = 'PHP AJAX';

// query
$sql = "SELECT * FROM books WHERE title = ?";
$q = $conn->prepare($sql);
$q->execute(array($title));

$q->setFetchMode(PDO::FETCH_BOTH);

// fetch
while($r = $q->fetch()){
  print_r($r);
}

?>

hittade det här men fattar inte hur man kommer åt varje cell i tabellraden :P

HJÄÄLP :P

Medlem sedan feb. 2008120 inlägg
#37

löste det =)

Medlem sedan feb. 20034 441 inlägg
#38

...och som vanligt kan du hjälpa andra genom att tala om hur du gjorde..

Medlem sedan feb. 2008120 inlägg
#39
<?php 
// configuration 
$dbtype        = "sqlite"; 
$dbhost     = "localhost"; 
$dbname        = "test"; 
$dbuser        = "root"; 
$dbpass        = "admin"; 

// database connection 
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); 

$title = 'PHP AJAX'; 

// query 
$sql = "SELECT * FROM books WHERE title = ?"; 
$q = $conn->prepare($sql); 
$q->execute(array($title)); 

$q->setFetchMode(PDO::FETCH_BOTH); 

// fetch 
while($r = $q->fetch()){ 
  echo $r['kollumnnamnet']; 
} 

?>
Medlem sedan maj 20012 237 inlägg
#40

Då du kör med:

$q->setFetchMode(PDO::FETCH_BOTH);

så fungerar även:

$r->kolumnNamnet;

PDO::FETCH_BOTH står för både:

FETCH_OBJECT
FETCH_ARRAY

258 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)