Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost] [PHP] Bepaalde tekens uit string filteren  (gelezen 2047 keer)

Offline Linux-user

  • Lid
  • Steunpunt: Nee
[Opgelost] [PHP] Bepaalde tekens uit string filteren
« Gepost op: 2009/10/08, 00:11:33 »
Ik ben bezig met het maken van een website waarop het mogelijk zal zijn om te registreren. Naar aanleiding van deze comic ben ik eens gaan testen of het me lukte om mijn eigen database om zeep te helpen. De tekens werden gewoon in de database ingevoerd, maar ik neem toch liever het zekere voor het onzekere en wil dus graag gevoelige tekens, zoals ; ' " ) eruit filteren.

str_replace leek mij hiervoor geschikt en dit werkt ook, in zekere zin.

$forbidden = array(";", "'", "\"", ")");
$filtered = str_replace($forbidden, "", $originele_string);

Het werkt dus in zekere, maar nog niet helemaal. De dubbele aanhalingstekens geven namelijk problemen. Als $originele_string namelijk als inhoud blablabla" heeft, wordt dit niet veranderd in blablabla, maar in blablabla\.

Heeft iemand een idee wat de beste methode is om deze tekens uit een string te filteren?
« Laatst bewerkt op: 2009/10/09, 19:13:13 door Linux-user »

Offline CRXDelSol

  • Lid
  • Steunpunt: Nee
Re: [PHP] Bepaalde tekens uit string filteren
« Reactie #1 Gepost op: 2009/10/09, 15:32:32 »
Hetgeen wat jij bedoelt, "database om zeep helpen", heeft de benaming: SQL-Injection.
Oftewel, bepaalde tekens die in een SQL query gebruikt worden via invulveld direct te injecteren in een query.

Wat je ook kan doen, is mysql_real_escape_string() gebruiken.
Deze zorgt ervoor dat hetgeen je injecteerd in de query, wordt omgezet naar een veilig string.

Dit is bijvoorbeeld mijn query:

<?php
mysql_query
"INSERT INTO users SET username = '" $_POST'username' ] . "'" )
?>

Als je dan in het invulveld dingen gaat neer zetten als:

',

Dan ben je uit die query gebroken, en kan je daarachter die komma gewoon een nieuwe query plaatsen.
Maar als ik dit gebruik:

<?php
mysql_query
"INSERT INTO users SET username = '" mysql_real_escape_string$_POST'username' ] ) . "'" )
?>

Wordt die ', automatisch omgezet naar een SQL-safe string.
Dan kan je nooit uit die query breken, want wat je ook in die input veld invult, het wordt altijd na de tijd door PHP omgezet naar een veilige string, dus komt het ook netjes in de database te staan zoals je het hebt ingevuld in de input veld.

Hoop dat je wat hebt aan deze informatie.

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: [PHP] Bepaalde tekens uit string filteren
« Reactie #2 Gepost op: 2009/10/09, 18:17:43 »
En kan het, in je originele aanpak, niet door eenvoudig de dubbele quote voor te stellen als '"' in plaats van "\"" ?

Offline Linux-user

  • Lid
  • Steunpunt: Nee
Re: [PHP] Bepaalde tekens uit string filteren
« Reactie #3 Gepost op: 2009/10/09, 19:12:46 »
Hetgeen wat jij bedoelt, "database om zeep helpen", heeft de benaming: SQL-Injection.
Oftewel, bepaalde tekens die in een SQL query gebruikt worden via invulveld direct te injecteren in een query.

Verhaal over mysql_real_escape_string()

Klopt. Daar was ik intussen via Google achter gekomen.

Het commando mysql_real_escape_string() had ik ook gevonden, maar ik maak geen gebruik van MySQL, maar van PostgreSQL. Hiervoor blijkt een soortgelijk commando te zijn, namelijk pg_escape_string(). Ik heb hiermee getest en dit werkt inderdaad.

Bedankt voor je hulp.

En kan het, in je originele aanpak, niet door eenvoudig de dubbele quote voor te stellen als '"' in plaats van "\"" ?

Dat dacht ik ook, maar dat bleek niet te werken. Het is mij tenminste niet gelukt om het op die manier werkend te krijgen.

Het probleem is nu in ieder geval opgelost, dus ik zal het topic op [Opgelost] zetten.