sprintf + sql injectie
Want ik probeer nu XSS attacks op m'n eigen systeem, zonder m_r_e_s maar tot nu toe gaat er nog niks mis.
Heb nu dit
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql = sprintf("INSERT INTO category () VALUES ('', %d, '%s', '%s')",
$parent_id,
$cat_name,
$cat_desc);
?>
$sql = sprintf("INSERT INTO category () VALUES ('', %d, '%s', '%s')",
$parent_id,
$cat_name,
$cat_desc);
?>
Ps. XSS heeft op zich niks met SQL of databases te maken.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Quotes komen er gewoon in te staan, zelfs bij het outputten hoef ik er niks aan te veranderen.
Hoe moet de database dit correct gaan verwerken?
Of ben je stiekum nog met magic_quotes aan het werk waardoor de quotes toevallig al worden geescaped?
En nogmaals, dit heeft niks met XSS te maken, dat is héél wat anders!
En laat die quotes nu juist het probleem zijn waardoor de mogelijkheid tot SQL injectie ontstaat. De manier die je nu gebruikt is dus niet veilig...
Edit: Gelijk een probleem, ik gebruik PDO dus blijkbaar werkt mysql_real_escape_string niet.
Quote:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: YES) in D:\root\webshop\webshop.class.php on line 45
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in D:\root\webshop\webshop.class.php on line 45
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in D:\root\webshop\webshop.class.php on line 45
Gewijzigd op 01/01/1970 01:00:00 door Gerben Jacobs
Edit: Voorbeeldje met PostgreSQL en PDO:
PostgreSQL voor beginners
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Gebruik nu dit;
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
public function addCategory($parent_id, $cat_name, $cat_desc) {
$stmt = $this->db_link->prepare("INSERT INTO category (cat_ID, cat_parent_ID, cat_name, cat_description) VALUES ('', :cat_parent_id, :cat_name, :cat_desc)");
$stmt->bindParam(':cat_parent_id', $parent_id);
$stmt->bindParam(':cat_name', $cat_name);
$stmt->bindParam(':cat_desc', $cat_desc);
if ($stmt->execute())
return 1;
else
return 0;
}
?>
public function addCategory($parent_id, $cat_name, $cat_desc) {
$stmt = $this->db_link->prepare("INSERT INTO category (cat_ID, cat_parent_ID, cat_name, cat_description) VALUES ('', :cat_parent_id, :cat_name, :cat_desc)");
$stmt->bindParam(':cat_parent_id', $parent_id);
$stmt->bindParam(':cat_name', $cat_name);
$stmt->bindParam(':cat_desc', $cat_desc);
if ($stmt->execute())
return 1;
else
return 0;
}
?>
.. en je hebt gelijk, ik moet meer met PDO doen, want ik gebruik het nu wel, maar ik ken de kracht er achter nog niet. Dus vooral nog veel oefenen.
p.s. $stmt is maar een variable, maar iemand enig idee waar het voor staat? Of is het gewoon 'statement'?
Geef trouwens nog wel even aan of je een integer als input verwacht:
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
of bv. een string: PDO::PARAM_STR. Zie de handleiding voor de details.