PHP: Is mysql_real_escape_string voldoende voor het opschonen van gebruikersinvoer?

Is mysql_real_escape_stringvoldoende voor het opschonen van gebruikersinvoer in de meeste situaties?

::EDIT::

Ik denk vooral aan het voorkomen van SQL-injectie, maar ik wil uiteindelijk weten of ik gebruikersgegevens kan vertrouwen nadat ik mysql_real_escape_string heb toegepast of dat ik extra maatregelen moet nemen om de gegevens op te schonen voordat ik deze door de toepassing en databases geef .

Ik zie waar het opschonen van HTML-tekens belangrijk is, maar ik zou het niet nodig achten om gebruikersinvoer te vertrouwen.

T


Antwoord 1, autoriteit 100%

mysql_real_escape_stringis niet in alle situaties voldoende, maar het is zeker een goede vriend. De betereoplossing is het gebruik van Voorbereide verklaringen

//example from http://php.net/manual/en/pdo.prepared-statements.php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

En niet te vergeten HTMLPurifierdie kan worden gebruikt om ongeldige/verdachte tekens.

………..

Bewerken:
Op basis van de onderstaande opmerkingen moet ik deze link plaatsen (had ik eerder moeten doen, sorry voor het creëren van verwarring)

mysql_real_escape_string() versus voorbereide verklaringen

Citeer:

mysql_real_escape_string() vatbaar voor
dezelfde soort problemen die van invloed zijn op
addlashes().

Chris Shiflett(beveiligingsexpert)


Antwoord 2, autoriteit 30%

Het antwoord op uw vraag is Nee. mysql_real_escape_string() is niet geschikt voor alle gebruikersinvoer en mysql_real_escape_string() stopt niet alle sql-injecties. addlashes() is een andere populaire functie om te gebruiken in php, en heeft hetzelfde probleem.

kwetsbare code:

mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));

poc exploit:

http://localhost/sql_test.php?id=1 or sleep(500)

De patch is om aanhalingstekens rond id te gebruiken:

mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");

Echt de beste aanpak is om geparametriseerde zoekopdrachten te gebruiken, waar een aantal mensen op hebben gewezen. Pdo werkt goed, adodb is een andere populaire bibliotheek voor php.

Als u mysql_real_escape_string gebruikt, mag dit alleen worden gebruikt voor sql-injectie en niets anders. Kwetsbaarheden zijn sterk afhankelijk van hoe de gegevens worden gebruikt. Beveiligingsmaatregelen moeten functie per functie worden toegepast. En ja, XSS is een ZEER ERNSTIG PROBLEEM. Niet filteren op html is een ernstige fout die een hacker zal gebruiken om u te pw3n. Lees de xss faq.


Antwoord 3, autoriteit 14%

Naar de database, ja. U moet ook rekening houden met het adequaat escapen / coderen van gegevens voor uitvoer.

U zou ook moeten overwegen om de invoer te validerenten opzichte van wat u ervan verwacht.

Heb je overwogen om voorbereide verklaringente gebruiken? PHP biedt talloze manieren om met uw database te communiceren. De meeste zijn beter dan de mysql_*-functies.

BOB, MDB2en de MySQL Verbeterdzou u op weg moeten helpen.


Antwoord 4, autoriteit 11%

In welke situaties?

Voor SQL-query’s is het geweldig. (Voorbereide verklaringen zijn beter – ik stem hier BOBvoor – maar de functie ontsnapt prima.) Voor HTML en de zoals, het is niet de tool voor de klus – probeer een generieke htmlspecialcharsof een meer precieze tool zoals HTML-zuiveraar.

Om de bewerking aan te pakken: de enige andere laag die u kunt toevoegen, is gegevensvalidatie, b.v. bevestig dat als u een geheel getal in de database invoert, en u verwacht een positief geheel getal, u een fout terugstuurt naar de gebruiker bij een poging om een ​​negatief geheel getal in te voeren. Wat de gegevensintegriteit betreft, is mysql_real_escape_stringde beste die je hebt om te ontsnappen (hoewel, nogmaals, voorbereide instructies zijn een schoner systeem dat ontsnappen volledig voorkomt).


Antwoord 5, autoriteit 5%

mysql_real_escape_string()is alleen nuttig voor het voorkomen van SQL-injectie-aanvallen. Het zal u niet helpen bij het voorkomen van cross-site scripting-aanvallen. Daarvoor moet u htmlspecialchars()gebruiken net voordat u gegevens uitvoert die oorspronkelijk zijn verzameld via gebruikersinvoer.


Antwoord 6, autoriteit 3%

Er zijn twee manieren, de ene is om voorbereide instructies te gebruiken (zoals vermeld in andere antwoorden), maar dat zal je app vertragen, omdat je nu twee verzoeken naar de database moet sturen in plaats van één. Als je kunt leven met de verminderde prestaties, ga ervoor; Voorbereide verklaringen maken uw code mooier en gemakkelijker om mee om te gaan.

Als je ervoor hebt gekozen om mysql_real_escape_string te gebruiken, zorg er dan voor dat je aan alle niet-vertrouwde strings ontsnapt. Een (mysql_real_escape_string) escape-tekenreeks is veilig voor SQL-injectie. Als je niet aan alle touwtjes ontsnapt, ben je niet veilig. Je zou mysql_real_escape_string echt moeten combineren met invoervalidatie; controleren of een variabele waarvan u verwacht dat deze een getal bevat, ook echt een getal is en binnen het verwachte bereik valt. Denk eraan, vertrouw de gebruiker nooit.


Antwoord 7, autoriteit 3%

Er zijn verschillende soorten “schoonmaken”.

mysql_real_escape_stringis voldoende voor databasegegevens, maar wordt nog steeds geëvalueerd door de browser bij weergave als het HTML is.

Om HTML uit gebruikersinvoer te verwijderen, kunt u strip_tagsgebruiken .

Ik raad je aan om te kijken naar het gebruik van BOBin plaats van gewone MySQL-dingen , omdat het kant-en-klare verklaringen ondersteunt en die het ontsnappen van ongeldige gegevens voor u regelen.


Antwoord 8, autoriteit 3%

Je kunt beide proberen, zoals in

function clean_input($instr) {
     // Note that PHP performs addslashes() on GET/POST data.
     // Avoid double escaping by checking the setting before doing this.
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($instr);
    }
    return mysql_real_escape_string(strip_tags(trim($instr)));
}

Antwoord 9

De beste manier om te gaan zou zijn om Voorbereide verklaringen te gebruiken


Antwoord 10

Ik dacht eraan toe te voegen dat PHP 5.2+ invoerfilterfuncties heeft die gebruikersinvoer op verschillende manieren kunnen zuiveren.

Hier is de handmatige invoeren een blogbericht[door Matt Butcher] over waarom ze geweldig zijn.

Other episodes