CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[SQLi] mysql_real_escape_string ?

BGR
BGR
Niveau 4
24 juillet 2011 à 16:53:25

Salut à tous ! :)

Voilà j'ai entendu dire qu'il était possible de passer à travers un mysql_real_escape_string pour procéder à une injection SQL. Cela me fait un peu peur car sur mon site je n'utilise que cette fonction pour "crypter" les données entrantes...Celà est-il avéré ?

Merci !

gros_sexe59[2]
gros_sexe59[2]
Niveau 10
24 juillet 2011 à 17:19:12

According to Stefan Esser, "mysql_real_escape_string() [is] not safe when SET NAMES is used."

Fire_Storm
Fire_Storm
Niveau 10
24 juillet 2011 à 17:23:29

Il y a eu apparemment mais il y a quelques années, résolu depuis je crois (à vérifier) un soucis au niveau des charsets un peu spéciaux (chinous etc), enfin j'ai jamais vraiment compris pourquoi le truc posait problème mais comme dit c'était il y a un moment donc surement résolu depuis.

Sinon oui il y a un moyen, tout con mais pas mal n'y pensent pas: les nombres.

On vérifie super bien tout les champs textes, mais on oublie les nombres -> et voilà comment réaliser une belle injection SQL.

Pourquoi parce qu'un nombre n'a pas besoin de guillemet, ce qui laisse donc le privilége au pirate de rajouter ce qu'il veut derrière, et si l'injection ne posséde pas de guillemet ce qui est tout à fait possible, ton mysql_real_escape_string ne servira strictement à rien.

La solution ? Soit tu mets des guilemets partout, et encore pas sur soit tu vérifies que le nombre que tu attends... est bien un nombre.

Exemple tout con:

SELECT * FROM news WHERE ID = 1

un coup de mysql_real etc sur le 1, sauf que le pirate va entrer ceci:

?ID=1 UNION SELECT * FROM members etc etc

-> l'injection passera.

Tout ça pour en venir à LA régle: ne JAMAIS faire confiance aux données provenant de l'utilisateur.

BGR
BGR
Niveau 4
24 juillet 2011 à 17:36:05

@Gros_sexe ( :hum: ) , Merci !

@Fire_Storm, merci pour ta réponse, cependant je ne comprend pas comment effectuer une injection SQL uniquement avec des nombres...Le principe de l'injection SQL si j'ai bien compris, c'est de pouvoir toucher aux requêtes à l'intérieur du code source en étant un utilisateur extérieur en foutant par exemple une apostrophe qui mettra fin à la chaine de caractères, et ainsi rajouter du code malicieux derrière.

Avec des nombres, il est impossible de mettre une apostrophe?!

Si je comprend bien ton exemple, j'aurais par exemple une page

index.php?page=news&idnews=1

Le pirate mettrait index.php?page=news&idnews=?1 UNION select * from members .....

et cela lui afficherait la liste de la table members ?! en sachant que j'ai bien un mysql_real_escape_string ??

deepblue
deepblue
Niveau 16
24 juillet 2011 à 17:42:09

Non. index.php?page=news&idnews=1 UNION select * from members

Pour ne pas avoir de problème : on met des quotes PARTOUT (exemple : select truc from machine where bidule="truc", quelque soit "truc") et on sécurise "truc".

Si on suit cette règle, on ne risque plus rien.

BGR
BGR
Niveau 4
24 juillet 2011 à 18:04:27

Merci. toujours est-il que cette histoire de passer un UNION + une requete sql en paramètre dans ce qui est censé être un nombre me parait super louche ! je vais appliquer vos conseils.

Merci

deepblue
deepblue
Niveau 16
24 juillet 2011 à 19:03:55

'SELECT * FROM foo WHERE id='.$_GET['id']

Si $_GET['id'] = 5, alors :
'SELECT * FROM foo WHERE id=5' -> aucun souci

Si $_GET['id'] = 5 UNION SELECT * FROM news, alors :
'SELECT * FROM foo WHERE id=5 UNION SELECT * FROM news' -> injection faites.

CQFD

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment