sprintf + sql injectie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Gerben Jacobs

Gerben Jacobs

25/01/2008 15:24:00
Quote Anchor link
Klopt het dat als je sprintf gebruikt je geen mysql_real_escape_string hoeft te gebruiken?

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$sql
= sprintf("INSERT INTO category () VALUES ('', %d, '%s', '%s')",
            $parent_id,
            $cat_name,
            $cat_desc);
?>
 
PHP hulp

PHP hulp

28/11/2024 19:33:38
 
Frank -

Frank -

25/01/2008 15:31:00
Quote Anchor link
Hoe ga je de quotes escapen die in teksten staan?

Ps. XSS heeft op zich niks met SQL of databases te maken.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Gerben Jacobs

Gerben Jacobs

25/01/2008 15:42:00
Quote Anchor link
Quotes komen er gewoon in te staan, zelfs bij het outputten hoef ik er niks aan te veranderen.
 
Frank -

Frank -

25/01/2008 15:47:00
Quote Anchor link
Quotes in de tekst worden niet geescaped? Je krijgt dus zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
INSERT INTO
  category
VALUES(
  '',
  '23',
  'auto's',
  'alles over auto's'
)

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!
 
Joren de Wit

Joren de Wit

25/01/2008 15:47:00
Quote Anchor link
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...
 
Gerben Jacobs

Gerben Jacobs

25/01/2008 15:51:00
Quote Anchor link
Ahh.. magic_quotes_gpc stond inderdaad aan. Nog eventjes testen!

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
Gewijzigd op 01/01/1970 01:00:00 door Gerben Jacobs
 
Frank -

Frank -

25/01/2008 15:59:00
Quote Anchor link
Je gebruikt PDO? Waarom wil je dan nog met sprintf aan de slag? En waarom dan nog met mysql_real_escape_string lopen klooien? Lees de handleiding eens en ga met prepared statements aan de slag. Gebruik vervolgens bindParam() om je data op de juiste manier in de query te zetten.

Edit: Voorbeeldje met PostgreSQL en PDO:
PostgreSQL voor beginners
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Gerben Jacobs

Gerben Jacobs

25/01/2008 16:07:00
Quote Anchor link
k thx.

Gebruik nu dit;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
    }

?>


.. 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'?
 
Frank -

Frank -

25/01/2008 16:12:00
Quote Anchor link
Yep, 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.
 



Overzicht Reageren

 
 

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.