Magisk sträng - Magic string
I datorprogrammering är en magisk sträng en ingång som en programmerare tror aldrig kommer externt och som aktiverar annars dold funktionalitet. En användare av detta program skulle sannolikt ge input som ger ett förväntat svar i de flesta situationer. Men om användaren faktiskt oskyldigt tillhandahåller den fördefinierade ingången, med anrop av den interna funktionaliteten, är programmets svar ofta ganska oväntat för användaren (vilket verkar "magiskt").
Bakgrund
Vanligtvis beror implementeringen av magiska strängar på tidsbegränsningar. En utvecklare måste hitta en snabb lösning istället för att fördjupa sig i ett problem och hitta en bättre lösning.
Till exempel, när man testar ett program som tar en användares personliga uppgifter och verifierar deras kreditkortsnummer, kan en utvecklare välja att lägga till en genväg för magiska strängar genom att ange den osannolika inmatningen av "***" som ett kreditkortsnummer skulle orsaka programmet att automatiskt fortsätta som om kortet var giltigt, utan att spendera tid på att verifiera det. Om utvecklaren glömmer att ta bort den magiska strängen, och en användare av det slutliga programmet råkar ange "***" som ett kreditkortsnummer för platshållare när han fyller i formuläret, skulle användaren av misstag utlösa den dolda funktionen.
Upplösning
Situationer / orsaker
Ofta finns det betydande tidsbegränsningar utanför utvecklarens kontroll redan från början av deras engagemang i ett projekt. Vanliga problem som kan leda till detta antimönster som ett resultat:
- Null! = Null eller någon variant där en datatyp inte jämför bitvis med en förmodligen identisk typ. Detta är en fråga som till och med kan uppstå inom samma utvecklingsmiljö (samma programmeringsspråk och kompilator). Detta problem har en lång historik för numeriska och booleska typer och de flesta kompilatorer hanterar detta bra (med tillämpliga varningar och fel, standardupplösning osv ...). Nullable typer som strängar har svårt att historiskt skilja olika definitioner för NULL . De fel / varningar som produceras är ofta allmänna eller ett "bäst passande" standardfel vars meddelande inte faktiskt beskriver vad som händer. Om utvecklaren inte kan få tillräckligt med ledtrådar för att spåra problemet genom felsökning, kan genväg och kodning i en "standard" -sträng vara det enda sättet att hålla projektet i tid. En lösning på detta kan vara tillämpningen av Null Object-mönstret .
- Programmerad i ett hörn. Ibland verkar en design okomplicerad och till och med enkel men visar sig ha en logisk brist, beroende på möjliga användarinmatningar, på grund av en ofta oförutsedd omständighet mot slutet av den planerade utvecklingen. Således kan en utvecklare känna behovet av att implementera en användarinmatning med speciella säkerhets- / drifttillägg för att hantera sådana omständigheter. Detta kan vara särskilt ironiskt eftersom det ibland blir uppenbart att en mer robust design från början sannolikt skulle ha lämnat utrymme för att hantera felet. Men detta skulle kanske ha tagit för mycket tid att implementera och det kan ha varit i konflikt med det grundläggande tekniska konceptet för KISS , att hålla en design och implementering enkel och endast uppfylla de initialt nödvändiga kraven.
- Tillåter extern åtkomst till en global flagga. Övertro på att en global flagga aldrig kan sättas av misstag eller skadligt (ofta ett ganska rimligt antagande) motiverar en sådan implementering för test- och felsökningsändamål, särskilt för små applikationer med enkla gränssnitt. Om distributionen av programmet är betydande är det dock bara en tidsfråga innan någon sätter flaggan. En uppenbar lösning är att aldrig använda en global variabel på ett sådant sätt. En utvecklare kan också göra flaggan omöjligt tillgänglig. Så den magiska strängen i sig skulle hanteras av programmet som alla andra ingångar. Användaren måste sedan återge inställningen såväl som producera en samling andra händelser som användargränssnittet diskret tillåter för att flaggan ska acceptera inställningen; ett mycket mer osannolikt scenario, men fortfarande möjligt.
Strikt formatering
Att begränsa ingångens format är en möjlig underhållslösning (bug fixing). I huvudsak innebär detta att validera inmatningsinformation för att kontrollera att den är i rätt format, för att minska risken för att den magiska strängen upptäcks av användaren. Exempel är att validera ett telefonnummer för att säkerställa att det endast innehåller siffror (och eventuellt mellanslag och skiljetecken i begränsad utsträckning) eller att kontrollera att en persons namn har ett förnamn och ett efternamn (och har en stor bokstav). Ett undantag görs för den magiska strängen i valideringskoden så att den inte kommer att avvisas genom validering. Det förväntas att, eftersom en användare sannolikt snabbt kommer att märka den strikta tillämpningen av formatering, skulle det troligen inte förekomma för användaren att försöka mata in en sträng som inte överensstämmer med formatet. Därför är det mycket osannolikt för användaren att prova den magiska strängen.
Som med alla valideringsprocesser är det viktigt att se till att formatet inte är begränsande på ett sätt som oavsiktligt begränsar användningen av applikationen av vissa användare. Ett exempel på detta är att begränsa inmatning av telefonnummer eller postnummer baserat på ett lands system (t.ex. att alla användare måste ge ett femsiffrigt postnummer ), vilket orsakar problem för legitima användare som är baserade i andra länder.
Målmedvetet genomförande
Som ofta är fallet med antimönster finns det specifika scenarier där magiska strängar är en korrekt lösning för en implementering. Exempel är fuskoder och påskägg . Dessutom finns det fall där användare uppfinner magiska strängar, och system som inte har kodat för att acceptera dem kan ge oväntade resultat, t.ex. saknade registreringsskyltar.
Se även
- Magiskt nummer (programmering)
- Tidsformatering och lagringsfel för problem som kan orsakas av magics
- Sentinelvärde (aka flaggvärde, trippvärde, skurkvärde, signalvärde, dummydata)
- Kanarievärde , specialvärde för att detektera buffertöverflöden
- Videospel fuskkoder som har samma ursprung
- XYZZY (kommando)
Referenser
-
^
Chris Falter (2008-03-06), en bra lösning för magiska strängdata , "Egghead Cafe Tuturiols" på Egghead Cafe , hämtad 2009-05-11 Extern länk i
|publisher=( hjälp ) CS1 maint: avskräckt parameter ( länk ) -
^ Frank Naude (2008-12-06), NULL , "Oracle Wiki" på Oracle Wiki , hämtad 2009-05-13 Extern länk i
|publisher=( hjälp ) CS1 maint: avskräckt parameter ( länk ) -
^ Wang Lam (2003-05-21), Uppförandet av NULL i SQL , "Stanford University" vid Stanford InfoLab , hämtad 2009-05-13 Extern länk i
|publisher=( hjälp ) CS1 maint: avskräckt parameter ( länk ) - ^ Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates; 2004, Head First Design Patterns , 1st ed., O'Reilly, Chapter 6, pg. 214, Kommandomönstret , ISBN 0-596-00712-4 , ISBN 978-0-596-00712-6
-
^ James McCaffrey (2009), testautomation för ASP.NET-webbappar med SSL , "Microsoft" på MSDN , hämtad 13-05-2009 Extern länk i
|publisher=( hjälp ) CS1 maint: avskräckt parameter ( länk ) - ^ Andrew Cumming; 2007, SQL Hacks , 1: a upplagan, O'Reilly, sid. 174, förhindra en SQL Injection Attack , ISBN 0-596-52799-3 , ISBN 978-0-596-52799-0
- ^ Brian Knight, Allan Mitchell, Darren Green, Douglas Hinson, Kathi Kellenberger; 2005, Professional SQL server 2005 integrationstjänster , 1: a upplagan, John Wiley and Sons, kapitel 5, sid. 129, Hantering av smutsiga data , ISBN 0-7645-8435-9 , ISBN 978-0-7645-8435-0
-
^ Sezen, Tonguc Ibrahim; Isikoglu, Digdem (2007-04-27). "FRÅN OZANER TILL GUDLÄGEN: FUSKA I INTERAKTIV UNDERHÅLLNING FRÅN OLIKA KULTURER" (PDF) : 8 . Hämtad 24-01-2009 . Cite journal kräver
|journal=( hjälp ) CS1 maint: avskräckt parameter ( länk ) - ^ https://www.snopes.com/autos/law/noplate.asp