Der er to meget vigtige ting, du skal gøre for at undgå alvorlige sikkerhedsproblemer.
-
Du skal undslippe brugerinput, før du sætter det i din SQL-forespørgsel. Escape betyder at undslippe alle specialtegn såsom
'
; Heldigvis er der en funktion, der allerede gør det automatisk:mysql_real_escape_string .Hvis du ikke undslipper brugerinput, kan der ske grimme ting. Forestil dig, at din forespørgsel er
INSERT INTO userdata VALUES ('$user_data')
. Forestil dig nu, at brugeren skrev'; DROP DATABASE userdata;
.Hvis du ikke undslipper det, bliver din forespørgsel:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Som du kan forestille dig, er dette ikke godt:Hvis du har aktiveret flere sætninger, kan du kysse farvel til din database. Dette kaldes en SQL-injektion angreb. -
Når du udsender din variabel til brugeren, skal du også korrekt erstatte HTML-specialtegn med HTML-enheder. Heldigvis er der også en funktion til at gøre det:htmlspecialchars() . Det vil transformere de specielle HTML-tegn såsom
<
til<
.Dette ser ud til at være et problem, der ofte undervurderes, men i virkeligheden er det meget alvorligt. Forestil dig, hvis
$user_data
indeholder<script>SomeNastyScript()</script>
. Det kan udnytte eksisterende sårbarheder i dine brugeres browser, eller det kan sende en ikke-HTTPOnly-cookie (der kan indeholde gemte adgangskoder) til angriberen, eller det kan narre brugeren til at skrive deres adgangskode på en formular, der er genereret gennem manipulation af DOM (mulig i javascript), eller en masse andre dårlige ting.Dette kaldes XSS (Scripting på tværs af websteder).
Kort version
-
Kald
mysql_real_escape_string
på strengen, før du indsætter den i din SQL-forespørgsel (men ikke når duecho
det). -
Kald
htmlspecialchars
på strengen, før den vises for brugeren (men ikke når du lægger den i databasen).