Ik ben geen DBA, maar moet geregeld wel een SQL query schrijven om data op te halen uit een of andere DB. Het principe van character escaping tegen SQL injectie ken ik wel, maar in praktijk heb ik daar nog nooit mee te doen gehad. Bij deze wel, al heeft het niets met security te maken
Ik gebruik in een van mijn scripts een query om op te vragen welke software geïnstalleerd staat op bepaalde computers. Die query zit er als volgt uit:
Alles ging goed tot ik vandaag een gekke error kreeg:
Wat verboser werken leerde me dat een nieuwe applicatie die ergens opdook deze error veroorzaakte, en natuurlijk zag ik meteen waarom:
Articulate Studio '09 Pro: We hebben honderden softwarepakketten maar dit is het eerste dat ik tegenkom dat een apostrof in zijn naam bevat en aldus de query natuurlijk breekt.
Hamvraag: hoe los ik het op? Wat googlen leert me dat dit een courant probleem is waarbij men de apostrof escaped met een andere apostrof. Alle voorbeelden die ik zag waren echter met statische input en niet met een variabele.
Daar valt een mouw aan te passen door, bijvoorbeeld eerst ergens:
Erg elegant lijkt mij dat evenwel niet en behalve de ' zullen er vast nog karakters zijn die ik moet escapen (_, % en god weet wat nog). Ik hoor graag wat meningen van mensen die meer in SQL thuis zijn.
En alvorens iemand anders het post:
SQL:
1
| SELECT sys.Netbios_Name0, arp.InstallDate0, arp.DisplayName0 FROM v_R_System sys JOIN v_Add_Remove_Programs arp ON sys.ResourceID = arp.ResourceID JOIN v_FullCollectionMembership fcm ON sys.ResourceID=fcm.ResourceID WHERE arp.DisplayName0 LIKE '$SearchString' AND fcm.CollectionID='SMS00004' |
Alles ging goed tot ik vandaag een gekke error kreeg:
code:
1
2
3
4
5
6
7
| Exception calling "Fill" with "1" argument(s): "Incorrect syntax near '09'. Unclosed quotation mark after the character string ''." At \\PATH\Script.ps1 :1201 char:18 + $SqlAdapter.Fill <<<< ($SqlDataSet) | Out-Null + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException |
Wat verboser werken leerde me dat een nieuwe applicatie die ergens opdook deze error veroorzaakte, en natuurlijk zag ik meteen waarom:
SQL:
1
2
3
| SELECT sys.Netbios_Name0, arp.InstallDate0, arp.DisplayName0 FROM v_R_System sys JOIN v_Add_Remove_Programs arp ON sys.R esourceID = arp.ResourceID JOIN v_FullCollectionMembership fcm ON sys.ResourceID=fcm.ResourceID WHERE arp.DisplayName0 L IKE 'Articulate Studio '09 Pro' AND (sys.Netbios_Name0 = '') AND fcm.CollectionID='SMS00004' |
Articulate Studio '09 Pro: We hebben honderden softwarepakketten maar dit is het eerste dat ik tegenkom dat een apostrof in zijn naam bevat en aldus de query natuurlijk breekt.
Hamvraag: hoe los ik het op? Wat googlen leert me dat dit een courant probleem is waarbij men de apostrof escaped met een andere apostrof. Alle voorbeelden die ik zag waren echter met statische input en niet met een variabele.
Daar valt een mouw aan te passen door, bijvoorbeeld eerst ergens:
C#:
1
| If ($SearchString.Contains"'"){$SearchString.Replace("'","''"} |
Erg elegant lijkt mij dat evenwel niet en behalve de ' zullen er vast nog karakters zijn die ik moet escapen (_, % en god weet wat nog). Ik hoor graag wat meningen van mensen die meer in SQL thuis zijn.
En alvorens iemand anders het post:
