Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php/mysql]escape voor een spatie of @

Pagina: 1
Acties:

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 23:20
Ik heb een php script dat waarden uit een form in een mysql tabel post.

Alleen werkt dit alleen als er geen spaties, @ of andere rare tekens in staan.

Ik heb geprobeerd om mijn code veilig te maken tegen exploitatie door mijn variabelen door de volgende code te halen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function fInput($data) {

  $data = trim($data);                                             
  $data = stripslashes($data);

  $data = htmlspecialchars($data);

        if (!preg_match("/^[a-zA-Z0-9. ]*$/",$data)) {

  $nameErr = "Alleen letters, cijfers en/of spaties toegestaan";

    echo '<script type="javascript">alert($nameErr);</script>';

        }


Hier gaat het waarschijnlijk mis. Hoe krijg ik nu een naam van een contactpersoon goed in mijn tabel. Zonder werkt het wel.

De insert is gewoon
PHP:
1
2
$contactpersoon = $fInput($_POST ['Contactpersoon '];
INSERT INTO `tabel`(`contactpersoon`,`email`) VALUES ($contactpersoon, $email);

[ Voor 3% gewijzigd door Paultje3181 op 07-11-2014 21:35 ]


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Een spatie, @ etc zijn geen rare tekens. Daar gaat het al een beetje mis.

Ik ken PHP niet zo goed maar je kan in PHP vast iets al parameterized queries gebruiken.

  • dennistd
  • Registratie: Augustus 2004
  • Laatst online: 01:38
Misschien zeg ik nu wel iets heel doms, maar werkt dit niet gewoon?
INSERT INTO `tabel`(`contactpersoon`,`email`) VALUES ('$contactpersoon', '$email');

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:47
Allereerst is de punt in de regular expression in preg_match een "matches all", dus deze regexp zal alles goedkeuren. Escape hem:

PHP:
1
if (!preg_match("/^[a-zA-Z0-9\. ]*$/",$data))


De waarden in je query moet je met quotes eromheen doen, anders is de query ongeldig. Dat is de reden dat "het met vreemde tekens niet werkt". Denk ook aan escapen om MySQL-injection te voorkomen.

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 18:12
http://php.net/manual/en/filter.filters.validate.php

Hoef je geen regex voor te gebruiken. (Als het om email gaat).

Als het om namen gaat, waarom wil je restricties invoeren? Gewoon paramatrized query's gebruiken met een maxlenght op het invulveld (en controle in php), en dan kom je toch een heel eind? Als iemand een @ als naam wilt, wat boeit dat. Je kan allemaal restricties inbouwen, maar als één of andere rus zijn naam in wilt voeren krijg je problemen. Je moet niet alles als gevaar zien.

Als je echt wilt 'valideren' dan zijn er genoeg REGEXen te vinden als je google op regex complete name oid.

Er zijn geen gevaarlijke tekens in zowel PHP als MySQL. Je denkwijze is verkeerd. Het gevaar is alleen hoe bepaalde tekens danwel of niet uitgevoerd worden.

Je kan zoeken op mysql_real_escape of gebruik paramatrized querys. Deze kun je googlen en dan kom je echt een heel eind.
$contactpersoon = $fInput($_POST ['Contactpersoon '];
Ik zie een spatie teveel..

En voor de rest moet je goed nadenken wat je precies wilt. Je wilt dat HTML tags omgezet worden, maar vervolgens valideer je naar [A-Z][a-z][0-9]... Ik ken geen HTML tag die daar aan voldoet.

[ Voor 113% gewijzigd door RedHat op 07-11-2014 22:14 ]


  • Solopher
  • Registratie: December 2002
  • Laatst online: 30-10 12:28
Als ik jou was zou ik dit niet proberen zelf op te lossen, maar voor een eenvoudige oplossing gaan namelijk gaan werken met PDO Prepared statements:

Hier heb je een introductie:
http://php.net/manual/en/parametrized-statements.php

Er is overigens ook een stuk geschreven in de FAQ, deze is wel outdated maar hierbij wordt de bedoeling een beetje uitgelegd. parametrized en prepaired statements zijn overigens hetzelfde alleen een andere benaming.
Programming FAQ - SQL
Pagina: 1