Magiska citat
Magiska citat var en funktion i PHP- skriptspråket , där strängar automatiskt escapes - specialtecken har ett omvänt snedstreck - innan de skickas vidare. Det introducerades för att hjälpa nykomlingar att skriva fungerande SQL-kommandon utan att kräva manuell escape. Det beskrevs senare som avsett att förhindra oerfarna utvecklare från att skriva kod som var sårbar för SQL-injektionsattacker .
Den här funktionen fasades officiellt ut från och med PHP 5.3.0 och togs bort i PHP 5.4 på grund av säkerhetsproblem.
Begrepp
Den aktuella revideringen av PHP-manualen nämner att logiken bakom magiska citat var att "hjälpa [förhindra] kod skriven av nybörjare från att vara farlig." Det introducerades dock ursprungligen i PHP 2 som en php.h-kompileringstidsinställning för msql, som bara undviker enstaka citattecken, "gör det lättare att skicka formulärdata direkt till msql-frågor". Det var ursprungligen tänkt som en "bekvämlighetsfunktion, inte som [en] säkerhetsfunktion."
Användningsomfånget för magiska citattecken utökades i PHP 3. Enkla citattecken, dubbla citattecken, omvänt snedstreck och nolltecken i all data som tillhandahålls av användaren har alla ett snedstreck framför sig innan de skickas till skriptet i $_GET ,
$ _REQUEST
, $ _POST
och $_COOKIE
globala variabler. Utvecklare kan sedan i teorin använda strängsammansättning för att konstruera säkra SQL-frågor med data från användaren. (Detta var mest korrekt när PHP 2 och PHP 3 var aktuella, eftersom de primära stödda databaserna endast tillät 1-byte teckenuppsättningar.)
Kritik
Magiska citat var aktiverade som standard i nya installationer av PHP 3 och 4, men kunde inaktiveras genom konfigurationsdirektivet magic_quotes_gpc .
Eftersom driften av magiska citat var bakom kulisserna och inte omedelbart uppenbar, kan utvecklare ha varit omedvetna om deras existens och de potentiella problem som de kunde introducera. PHP-dokumentationen påpekade flera fallgropar och rekommenderade att de skulle inaktiveras, trots att de är aktiverade som standard.
Problem med magiska citat ingår:
- Alla data som tillhandahålls av användaren är inte avsedda att infogas i en databas. De kan renderas direkt på skärmen, lagras i en session eller förhandsgranskas innan de sparas. Detta kan resultera i att snedstreck läggs till där de inte önskas och visas för slutanvändaren. Denna bugg smyger sig ofta in i även mycket använd programvara.
- Inte all data som tillhandahålls av användaren och används i en databasfråga erhålls direkt från källor som skyddas av magiska citat. Till exempel kan ett värde som tillhandahålls av användaren infogas i en databas, skyddat av magiska citattecken, och senare hämtas från databasen och användas i en efterföljande databasoperation. Den senare användningen är inte skyddad av magiska citat, och en naiv programmerare som är van att förlita sig på dem kanske inte är medveten om behovet av att skydda det explicit.
- Magiska citat använder också den generiska funktionaliteten som tillhandahålls av PHPs
addslashes()-
funktion, som inte är Unicode-medveten och fortfarande är föremål för SQL-injektionssårbarheter i vissa flerbyte-teckenkodningar. Databasspecifika funktioner sommysql_real_escape_string()
eller, där det är möjligt, förberedda frågor med bundna parametrar, är att föredra. - Medan många databashanteringssystem stöder undvikande citat med ett snedstreck, kräver standarden faktiskt att ett annat citat används. Magiska citat ger inget skydd för databaser som inte är inställda för att stödja undflyende citat med ett snedstreck.
- Portabilitet är ett problem om en applikation är kodad med antagandet att magiska citat är aktiverade och sedan flyttas till en server där de är inaktiverade, eller vice versa.
- Att lägga till magiska citat och sedan ta bort dem där det är lämpligt medför en liten men onödig mängd prestationskostnader.
- Magiska citat skyddar inte mot andra vanliga säkerhetsbrister som skriptattacker på flera ställen eller SMTP-headerinjektionsattacker .
I november 2005 beslutade de grundläggande PHP-utvecklarna att på grund av dessa problem skulle funktionen magiska citat tas bort från PHP 6. När utvecklingen av PHP 6 avstannade och utvecklingen fortsatte på 5.x-grenen istället, fasades funktionen ut i PHP 5.3. 0 och togs bort i 5.4.
Andra tillvägagångssätt
- Vissa språk som Perl och Ruby väljer ett tillvägagångssätt som involverar dataförgiftning , där data från opålitliga källor, såsom användarinmatning, anses vara "nedsmutsade" och inte kan användas för farliga operationer förrän de uttryckligen markerats som tillförlitliga, vanligtvis efter validering eller kodning . Eftersom konstruktionen av SQL-frågor anses vara "farlig" i detta sammanhang, tvingar detta programmeraren att ta itu med problemet. Tainting löser inte problemet, men det lyfter fram de fall där det finns ett problem så att programmeraren kan lösa dem på lämpligt sätt.
- Joel Spolsky har föreslagit att man använder en form av ungersk notation som indikerar om data är säkra eller osäkra.
- Moderna databasmotorer och bibliotek använder parametriserade frågor för att skicka data till databasen separat från SQL-kommandon, vilket avsevärt minskar behovet av att undvika data innan frågorna konstrueras.