Verwerken van bedrijfsnaam met speciale leestekens
Door
P Wever
op 03-01-2023 11:14
gewijzigd op 03-01-2023 11:16
3.212 views
Beste,
Ik ben bezig met een CRM aan het ontwikkelen en ik loop tegen het bedrijfsnaam aan tegen, ik kan hem niet verwerken binnen de database. Hoe kan ik dit tackelen? want het weergeven van alle bedrijfsinformatie gaat via bedrijfsnaam en de enkele en dubbele quotes snijden dan de string af. Hier zijn diverse voorbeelden;
v.v. d´Olde Veste ´54
Mini camping "Onder" de Heerenbrug
Bierproeverij ' de Beijerlandse Biersommelier '
$db->real_escape_string(......) moet je ALTIJD toepassen bij het gebruik van manipulatieve data (zoals POST, GET, COOKIE) in een query. Het beschermt je query tegen corruptie vanuit bepaalde tekens (denk aan bijv. de apostrof '), en dus ook tegen SQL-injection. Dus als je bijvoorbeeld 's-Gravenzande niet ingevoerd krijgt. Dan weet je dat je deze belangrijke regel mist!
Ik heb het toegepast en ook wat veranderd bij het aanmaken van nieuwe klant;
' en " word nu vervangen met ` en alle data word nu escaped.
dus het is opgelost.
Ik zie geen reden om de tekst aan te passen. De escape-functie zorgt dat _in_ de query voor de ' een \ komt te staan. Daarmee gaat die prima de database in.
Door er een ander teken van te maken, los je het hier op, maar mogelijk niet op 20 andere plekken en je applicatie: met escapen krijg je alles gewoon 1 op 1 in je database.
Als je het aanpast, komt er een moment dat het bij het ophalen weer mis gaat: iets staat tussen 2 van de scheven "apostrofjes" (wat er niet uitziet) of bij vergelijken lijkt het of een bedrijfsnaam nog niet aanwezig is, omdat bij het vergelijken een ' en een ` echt anders zijn.
Dus: ja, het "werkt" want je krijgt geen foutmelding. Maar dat wil niet zeggen dat dat een goede weg is om te bewandelen.
[size=xsmall]Toevoeging op 03/01/2023 20:52:03:[/size]
(en zeker in een CRM wil je niet je klanten tegen de haren in strijken door hun namen aan te passen, omdat JIJ niet om kan gaan met niet-heel-bijzondere karakters in een naam)
[quote="P Wever op 03/01/2023 13:36:01"]
Ik heb het toegepast en ook wat veranderd bij het aanmaken van nieuwe klant;
' en " word nu vervangen met ` en alle data word nu escaped.
dus het is opgelost.
Ik zie geen reden om de tekst aan te passen. De escape-functie zorgt dat _in_ de query voor de ' een \ komt te staan. Daarmee gaat die prima de database in.
Door er een ander teken van te maken, los je het hier op, maar mogelijk niet op 20 andere plekken en je applicatie: met escapen krijg je alles gewoon 1 op 1 in je database.
Als je het aanpast, komt er een moment dat het bij het ophalen weer mis gaat: iets staat tussen 2 van de scheven "apostrofjes" (wat er niet uitziet) of bij vergelijken lijkt het of een bedrijfsnaam nog niet aanwezig is, omdat bij het vergelijken een ' en een ` echt anders zijn.
Dus: ja, het "werkt" want je krijgt geen foutmelding. Maar dat wil niet zeggen dat dat een goede weg is om te bewandelen.
[size=xsmall]Toevoeging op 03/01/2023 20:52:03:[/size]
(en zeker in een CRM wil je niet je klanten tegen de haren in strijken door hun namen aan te passen, omdat JIJ niet om kan gaan met niet-heel-bijzondere karakters in een naam)
[/quote]
' De escape-functie zorgt dat _in_ de query voor de ' een \ komt te staan. Daarmee gaat die prima de database in.'
Omdat dit niet eruit ziet, dit word weergegeven op de dashboard en moet ook op kunnen worden gezocht. Dus als voorbeeld "V.v. d `Olde Veste `54" en niet "V.v. d \`Olde Veste \`54", daardoor kan ik letterlijk record niet ophalen. dus dat breekt meer dan het goed doet.
Ikzelf gebruik altijd mysqli_real_escape_string() of de equivalent real_escape_string(), en ik hoef nergens op te filteren. Alles wat op ik haal met vreemde tekens, is zoals het hoort. Dus blijkbaar pas jij het verkeerd toe?
Even een simpel voorbeeld: het euroteken wordt met htmlentities() vertaald naar € . Dat is ook een soort van escaping.
Maar wat ziet iemand die de html-pagina bekijkt? Gewoon het euroteken.
Nu naar je query: stel jij wilt "d'olde veste" opslaan.
$query = "INSERT INTO tabel (naam) VALUES ('$naam_esc')";
// nu is $query dus INSERT INTO tabel (naam) VALUES ('d\'olde veste')
?>
De query stuur je naar je database. Deze database moet je query interpreteren.
Hij weet dat values tussen ' ' zullen staan.
Had er geen \ voor de ' die na de letter d komt, dan had hij die ' gezien als een einde van een value en daarna een foutmelding gegeven omdat hij de rest van de tekst niet meer begrijpt.
Maar vanwege \' snapt hij dat die ' niet een "einde value" betekenis heeft, maar dat deze ' gewoon letterlijk een ' is.
En vervolgens komt er dus in je database gewoon "d'olde veste" te staan.
(vergelijk het met het euroteken)
Die \ is dus een teken dat alleen maar een aanwijzing is voor je database.
"vroeger" had je nog van die "magic-quotes" waarbij PHP zelf ook al \ ging toevoegen, en dan kreeg je "soms" inderdaad \ in de database als je daarna ook nog de database escape functie gebruikt. Maar die setting is gelukking intussen al een jaar of 10 verleden tijd.
NB
ik gebruik $this-db->escape() maar daar moet je de escape functie gebruik van jouw database class, of gewoon mysqli_real_escape_string()
[size=xsmall]Toevoeging op 04/01/2023 12:18:49:[/size]
Probeer het eens, en kijk daarna wat er werkelijk in je database terecht is gekomen.
Ik heb het idee dat je de query op het scherm hebt gezet en daarna zelf de conclusie hebt getrokken dat het mis zal gaan.
Ikzelf gebruik altijd mysqli_real_escape_string() of de equivalent real_escape_string(), en ik hoef nergens op te filteren. Alles wat op ik haal met vreemde tekens, is zoals het hoort. Dus blijkbaar pas jij het verkeerd toe?
Zodra ik maar iets in de query moet verwerken; gaat de data eerst door mijn functie 'bedrijfsnaam' wat niks anders is dan preg_match en controleren voor 2 tekens en indien aanwezig vervangen met `.Ik pas hierna mysqli_real_escape_string() toe (Ik heb er een functie van gemaakt clearinput voor in mijn class) voordat ik het toesta dat die gebruikt word in de query.
ik zal kleine snippets plaatsen
controleren of er gepost word en in die brackets heb ik deze controle;