sql >> Database >  >> RDS >> Mysql

Mysql_*-functies vervangen door PDO en voorbereide instructies

Bedankt voor de interessante vraag. Hier ga je:

Het ontsnapt aan gevaarlijke karakters,

Uw concept is volkomen fout.
In feite is "gevaarlijke tekens" een mythe, die zijn er niet. En mysql_real_escape_string ontsnapt maar slechts een tekenreeksscheidingstekens . Uit deze definitie kun je de beperkingen afleiden - het werkt alleen voor strings .

het is echter nog steeds kwetsbaar voor andere aanvallen die veilige tekens kunnen bevatten, maar schadelijk kunnen zijn voor de weergave van gegevens of in sommige gevallen voor het kwaadwillig wijzigen of verwijderen van gegevens.

Je mixt hier alles.
Over database gesproken,

  • voor de snaren is het NIET kwetsbaar. Zolang uw strings worden geciteerd en ontsnapt, kunnen ze niet "gegevens kwaadwillig wijzigen of verwijderen".*
  • voor de andere gegevenstypegegevens - ja, het is nutteloos . Maar niet omdat het enigszins "onveilig" is, maar gewoon vanwege oneigenlijk gebruik.

Wat betreft het weergeven van gegevens, ik veronderstel dat het offtopic is in de PDO-gerelateerde vraag, aangezien PDO ook niets te maken heeft met het weergeven van gegevens.

gebruikersinvoer ontsnappen

^^^ Nog een waanidee die moet worden opgemerkt!

  • een gebruikersinvoer heeft absoluut niets te maken met ontsnappen . Zoals je kunt leren van de vorige definitie, moet je strings escapen, niet wat voor "gebruikersinvoer" dan ook. Dus nogmaals:

    • je hebt escape-strings, ongeacht hun bron
    • het heeft geen zin om aan andere soorten gegevens te ontsnappen, ongeacht de bron.

Begrijp je wat je bedoelt?
Nu hoop ik dat je de beperkingen van ontsnappen en de misvatting over 'gevaarlijke personages' begrijpt.

Ik heb begrepen dat het gebruik van BOB/opgemaakte verklaringen een veel veiligere is

Niet echt.
In feite zijn er vier verschillende query-onderdelen die we er dynamisch aan kunnen toevoegen:

  • een tekenreeks
  • een nummer
  • een ID
  • een syntaxiszoekwoord.

dus je kunt zien dat ontsnappen slechts één probleem dekt. (maar natuurlijk, als je getallen als tekenreeksen behandelt (door ze tussen aanhalingstekens te zetten), indien van toepassing , je kunt ze ook veilig maken)

terwijl voorbereide verklaringen dekken - ugh - hele 2 isues! Een groot probleem;-)

Zie voor de andere 2 problemen mijn eerdere antwoord, Moet ik in PHP bij het indienen van strings naar de database zorgen voor illegale tekens met htmlspecialchars() of een reguliere expressie gebruiken?

Nu zijn de functienamen anders, dus mijn mysql_query, mysql_fetch_array, mysql_num_rows enz. werken niet langer.

Dat is een andere, ernstige waanvoorstelling van PHP gebruikers , een natuurramp, een catastrofe:

Zelfs als je een oude mysql-driver gebruikt, mag men nooit kale API-functies gebruiken in hun code! Je moet ze in een bibliotheekfunctie plaatsen voor dagelijks gebruik! (Niet als een magische rite, maar alleen om de code korter, minder repetitief, foutbestendig, consistenter en leesbaarder te maken).

Hetzelfde geldt ook voor de BOB!

Nu weer verder met je vraag.

maar door ze te gebruiken, elimineert dit de noodzaak om iets als mysql_real_escape_string te gebruiken?

JA.

Maar ik denk dat dit ongeveer het idee is van wat er moet gebeuren om een ​​gebruiker uit een database te halen

Niet om op te halen, maar om wat voor gegevens dan ook aan de zoekopdracht toe te voegen !

je moet een lengte geven na PDO:PARAM_STR als ik me niet vergis

Dat kan, maar het hoeft niet.

Is dit allemaal veilig?

Op het gebied van databaseveiligheid zijn er gewoon geen zwakke plekken in deze code. Hier valt niets te beveiligen.

voor de weergavebeveiliging - zoek gewoon op deze site naar de XSS zoekwoord.

Ik hoop dat ik wat licht op de zaak werp.

Trouwens, voor de lange inserts kun je enig gebruik maken van de functie die ik ooit heb geschreven, Helperfunctie invoegen/bijwerken met PDO

Ik gebruik op dit moment echter geen voorbereide verklaringen, omdat ik de voorkeur geef aan mijn zelfgemaakte tijdelijke aanduidingen boven hen, met behulp van een bibliotheek Ik noemde hierboven. Dus, om de code die door de riha hieronder is gepost tegen te gaan, zou het zo kort zijn als deze 2 regels:

$sql  = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
$data = $db->getRow($sql,$_GET['name'],'admin',1);

Maar u kunt dezelfde code natuurlijk ook gebruiken met voorbereide instructies.

* (yes I am aware of the Schiflett's scaring tales)



  1. Hoe een bestand van de ene map naar de andere te verplaatsen met behulp van PL SQL

  2. PDOException "kon stuurprogramma niet vinden"

  3. Wizard Importeren/Exporteren gebruiken in SQL Server - SQL Server / TSQL-zelfstudie, deel 104

  4. Hoe een IF-statement in SQL uit te voeren?