Bescherm het gedrag van de ColdFusion-server van Dreamweaver tegen aanvallen door SQL-injectie.
Beveiligingsrisico wegens aanvallen door SQL-injectie
In sommige databases kunt u meerdere SQL-instructies in één query verzenden. Daarom zijn er potentiële beveiligingsrisico's wanneer u parameters in een querytekenreeks doorgeeft aan een dynamisch gegenereerde databasequery. Hackers kunnen proberen de URL te wijzigen of variabelen in een dynamische query te vormen door schadelijke SQL-instructies aan bestaande parameters toe te voegen. Dit wordt meestal een aanval door een SQL-injectie genoemd. Sommige code voor het servergedrag die door Dreamweaver is gemaakt, moet worden gewijzigd om het risico op aanvallen door SQL-injecties te verminderen. Lees het volgende Wikipedia-artikel voor meer informatie over SQL-injecties.
Opmerking: het probleem dat in dit artikel is beschreven, is opgelost in de Dreamweaver 8.0.2-update.
Oplossing: werk het servergedrag bij
Wanneer u een querytekenreeks een parameter laat doorgeven, moet u zorgen dat alleen de verwachte informatie wordt doorgegeven. Adobe heeft een Dreamweaver 8.0.2-update gemaakt waarmee het risico van aanvallen door SQL-injecties wordt gereduceerd. Deze oplossingen zijn opgenomen in alle volgende releases van Dreamweaver. Nadat u Dreamweaver 8 hebt bijgewerkt, moet u het servergedrag opnieuw toepassen op de pagina's die de servers gebruiken, en deze pagina's opnieuw implementeren op uw server.
In het overige deel van dit document wordt besproken hoe u Dreamweaver MX 2004-code handmatig bewerkt om aanvallen door SQL-injecties met het ColdFusion-servermodel te vermijden. Hieronder vindt u servergedrag dat kwetsbaar is voor deze aanvallen, evenals de oplossingen:
Recordset met een filter
Niet-gefilterde recordsets hoeven niet te worden gewijzigd, maar gefilterde recordsets wel. In het onderstaande voorbeeld wordt een Dreamweaver MX 2004-recordset met de naam Recordset1 gefilterd door een ID-waarde die doorgegeven is door een URL-parameter. De onderstaande gemarkeerde code moet worden gewijzigd:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
Als u de recordset wilt beschermen tegen aanvallen door SQL-injecties, gebruikt u de code cfqueryparam in de code cfquery die de SQL SELECT-instructie bevat. De code cfqueryparam verifieert het gegevenstype van de queryparameter en helpt uw databases te beschermen tegen ongeautoriseerde gebruikers. De gele regel is de gewijzigde, veilige code:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Servergedrag Record invoegen en formulierwizard voor records invoegen
Als u de recordset wilt beschermen tegen aanvallen door SQL-injecties, gebruikt u de code cfqueryparam in de code cfquery die de SQL INSERT-instructie bevat. De code cfqueryparam verifieert het gegevenstype van de queryparameter en helpt uw databases te beschermen tegen ongeautoriseerde gebruikers.
Oorspronkelijke code. De onderstaande gemarkeerde code moet worden gewijzigd:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif> )</cfquery>
Gewijzigde veilige code:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif> )</cfquery>
Opmerking: kies de toepasselijke cfslqtype- en maxlength-waarden voor uw gegevens.
Record bijwerken en formulierwizard voor recordupdate
Voor het servergedrag Record bijwerken en de formulierwizard voor recordupdate is een combinatie van de bovenstaande oplossingen vereist. Zoek eerst naar de cfquery die de SQL SELECT-instructie bevat, en wijzig deze zoals beschreven in Recordset met een filter. Zoek dan naar de cfquery die de SQL UPDATE-instructie bevat, en wijzig deze zoals beschreven in Servergedrag Record invoegen en formulierwizard voor records invoegen.
Servergedrag Record verwijderen
Wijziging van het servergedrag Record verwijderen lijkt op de wijziging voor Recordset met een filter.
Oorspronkelijke code:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
Gewijzigde veilige code:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Opmerking: kies de toepasselijke cfslqtype- en maxlength-waarden voor uw gegevens.
Servergedrag Gebruiker aanmelden
Als u de code van het servergedrag Gebruiker aanmelden wilt herstellen, zoekt u naar de labels voor cfquery en voegt u de labels cfqueryparam toe.
Oorspronkelijke code:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
Gewijzigde veilige code:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"> AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>
Opmerking: kies de toepasselijke cfslqtype- en maxlength-waarden voor uw gegevens.
Servergedrag Nieuwe gebruiker controleren
Voor het servergedrag Nieuwe gebruiker controleren moet eerst het servergedrag Record invoegen aan de pagina worden toegevoegd. Zoek eerst naar de cfquery die de SQL SELECT-instructie bevat, en wijzig deze zoals beschreven in Recordset met een filter. Zoek dan naar de cfquery die de SQL INSERT-instructie bevat, en wijzig deze zoals beschreven in Servergedrag Record invoegen en formulierwizard voor records invoegen.
Hoofddetailpaginaset
Voor het toepassingsobject Hoofddetailpaginaset moeten de wijzigingen voornamelijk worden aangebracht in de recordset die Dreamweaver maakt voor de detailpagina. Als u geen gefilterde recordset op de hoofdpagina hebt, hoeven er geen wijzigingen op de hoofdpagina worden aangebracht. Als u een gefilterde recordset op de hoofdpagina hebt, leest u Recordset met een filter om de code van de recordset bij te werken.
Zoek voor de detailpagina naar de cfquery die de SQL SELECT-instructie bevat, en wijzig deze zoals beschreven in Recordset met een filter.
Aanvullende informatie
Adobe raadt aan dat u de code cfqueryparam in elke cfquery-code gebruikt om uw databases te helpen beschermen tegen ongeautoriseerde gebruikers. Zie voor meer informatie: