Ga naar de tweede regel in codeweergave, direct na het include-bestand voor de verbinding, en voeg de GetSQLValueString()-functie toe aan het begin van de code als volgt:
<?php if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } ?>
Probleem
In sommige databases kunt u meerdere SQL-instructies in één query verzenden. Daarom zijn er potentiële beveiligingsrisico's wanneer je parameters in een query-tekenreeks doorgeeft aan een dynamisch gegenereerde database-query. Hackers kunnen proberen URL- of formuliervariabelen in een dynamische query te wijzigen door kwaadaardige SQL-instructies toe te voegen aan bestaande parameters.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. (Ref. 201713)
Opmerking: Het probleem dat in deze TechNote wordt beschreven, is opgelost in de Dreamweaver 8.0.2 Updater.
Deze TechNote behandelt PHP server behaviors van Dreamweaver. Er zijn aparte TechNotes voor de ColdFusion-, ASP VBScript-, ASP JavaScript- en JSP-server behaviors. De ASP.NET server behaviors worden niet beïnvloed.
Oplossing
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 Updater ontwikkeld die het risico op SQL-injectieaanvallen vermindert.Deze oplossingen worden opgenomen in alle toekomstige releases van Dreamweaver. Na het bijwerken van Dreamweaver 8 moet je de serverbehaviors opnieuw toepassen op de pagina's die ze gebruiken en deze pagina's opnieuw publiceren naar je server.
De rest van deze TechNote beschrijft hoe je Dreamweaver MX 2004-code handmatig kunt bewerken om SQL-injectieaanvallen te voorkomen met het PHP-servermodel.Server behaviors die kwetsbaar zijn voor deze aanvallen worden hieronder vermeld, samen met 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 genaamd 'rs_byDate' gefilterd op een datumwaarde die wordt doorgegeven via een URL-parameter.De gemarkeerde code hieronder is wat moet worden gewijzigd:
<?php $colname_rs_byDate = "1"; if (isset($_GET['relDate'])) { $colname_rs_byDate = (get_magic_quotes_gpc()) ? $_GET['relDate'] : addslashes($_GET['relDate']); } mysql_select_db($database_dreamqa2, $dreamqa2); $query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate); $rs_byDate = mysql_query($query_rs_byDate, $dreamqa2) or die(mysql_error()); $row_rs_byDate = mysql_fetch_assoc($rs_byDate); $totalRows_rs_byDate = mysql_num_rows($rs_byDate); ?>
Om de recordset te beschermen tegen SQL injection-aanvallen, moet een aangepaste GetSQLValueString()-functie worden gemaakt bovenaan de pagina. Deze functie controleert het gegevenstype van de query-parameter. Zodra de functie is gemaakt, werk je de recordset-code bij om de GetSQLValueString()-functie te gebruiken.
Gewijzigde code:
$colname_rs_byDate = $_GET['relDate'];
Werk de recordset-code bij om een SQL-tekenreeks te maken met de functie GetSQLValueString() die hierboven is gemaakt. Werk de waarde van de variabele $query_rs_byDate bij:
Originele code:
$query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = '%s'", $colname_rs_byDate);
Gewijzigde veilige code:
$query_rs_byDate = sprintf("SELECT * FROM albums WHERE relDate = %s", GetSQLValueString($colname_rs_byDate, "date"));
Servergedragingen Invoegen, Bijwerken en Verwijderen van records en wizard Record invoegformulier
De servergedragingen Invoegen, Bijwerken en Verwijderen van records en de wizard Record invoegformulier gebruiken al de functie GetSQLValueString(), dus ze moeten worden verfijnd om SQL-injecties te voorkomen. De enige wijzigingen die nodig zijn betreffen de functie GetSQLValueString().
Hier is de originele code. De regel die moet worden gewijzigd is geel gemarkeerd:
if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") {$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } }
Werk de definitie van de variabele $theValue bij:
Originele code:
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
Gewijzigde beveiligde code:
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
Servergedrag Gebruiker aanmelden
Dit zijn de stappen om het servergedrag Log In User op te lossen:
Wijzig de code die de login SQL-query samenstelt.
Originele code:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username='%s' AND password='%s'", get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
Gewijzigde beveiligde code:
$LoginRS__query=sprintf("SELECT username, password FROM login WHERE username=%s AND password=%s", GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));
Servergedrag Nieuwe gebruiker controleren
Voor het servergedrag Nieuwe gebruiker controleren moet eerst het servergedrag Record invoegen aan de pagina worden toegevoegd. De GetSQLValuesString()-functie is inbegrepen bij het Insert Record-servergedrag. Het enige wat gedaan moet worden is de GetSQLValuesString() bijwerken om SQL Injection beter af te handelen en het Check New User-servergedrag bijwerken om deze functie te gebruiken wanneer een parameter wordt doorgegeven.
Wijzig de code om de login SQL-query samen te stellen en gebruik de GetSQLValuesString() om parameters door te geven. Zoek bovenaan de pagina de code in de sectie die begint met // *** Redirect if username exists.
Originele code:
$LoginRS__query = "SELECT username FROM login WHERE username='" . $loginUsername . "'"
Gewijzigde beveiligde code:
$LoginRS__query = sprintf("SELECT username FROM login WHERE username=%s", GetSQLValueString($loginUsername, "text"));
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 je een gefilterde recordset hebt, raadpleeg dan recordset met een filter om de recordsetcode bij te werken.
Dreamweaver maakt een gefilterde recordset in de detailpagina, dus die recordsetcode moet worden bijgewerkt om een GetSQLValueString()-functie te gebruiken voor het doorgeven van parameters en sprintf() om de SQL-tekenreeks samen te stellen.
Werk de code voor de variabeledeclaratie bij en stel de SQL-query samen met behulp van de GetSQLValuesString()-functie.
Originele code:
$recordID = $_GET['recordID']; $query_DetailRS1 = "SELECT * FROM albums WHERE ID = $recordID";
Gewijzigde beveiligde code:
$colname_DetailRS1 = "-1"; if (isset($_GET['recordID'])) { $colname_DetailRS1 = (get_magic_quotes_gpc()) ? $_GET['recordID'] : addslashes($_GET['recordID']); } $query_DetailRS1 = sprintf("SELECT * FROM albums WHERE ID = %s", GetSQLValueString($colname_DetailRS1, "int"));
Record Update Form wizard
Aanvullende informatie
Raadpleeg het volgende artikel voor meer informatie over SQL-injectie: Wikipedia-artikel over SQL-injectie.
Adobe-beveiligingsbulletin: APSB 06-07 Dreamweaver Server Behavior SQL-injectiekwetsbaarheid.
Prachtige websites ontwerpen in Dreamweaver
Ontwerp, codeer en beheer dynamische websites in een krachtige alles-in-één tool.