Fråga:
Är det dålig praxis att använda GET-metoden som användarnamn / lösenord för inloggning för administratörer?
Amirreza Nasiri
2017-01-04 08:44:27 UTC
view on stackexchange narkive permalink

Jag jobbar med webbapplikationer och som ni vet är det ett måste i de flesta fall att ha en administratörspanel. Vi kan se att många webbapplikationer har en specifik inloggningssida för administratörer där det finns ett formulär (vanligtvis POST -metod) som administratörer kan använda för att logga in på deras panel.

Men eftersom fältnamnen är kända kan en hackare försöka knäcka lösenorden även om vissa säkerhetsmetoder är implementerade.

Så vad är problemet med en enkel GET -nyckel (som användarnamn) och dess värde (som lösenord)? Varför det inte används mycket eller åtminstone föreslås inte i många artiklar?

För administratörer behövs det inte riktigt användarvänliga inloggningssidor! Data loggas i båda fallen ( GET / POST ) om det finns en MiTM-angripare.

Men med den här metoden kommer fälten att vara okända förvänta sig för administratörer själva. Här är ett exempel på en PHP-kod:

"category.php": (Ett meningslöst sidnamn)

  <? Phpif (isset ($ _ GET ['meaningless_user']) && $ _GET ['meaningless_word'] == "något") {session_start (); $ _SESSION ["user"] = "test"; rubrik ('Plats: category.php'); // omdirigera till samma eller annan sida så att GET-parametrar försvinner från url} annars {die (); // Så det blir som en tom sida}? >  
Du bör använda HTTPS då behöver du inte oroa dig för MITM.Om du inte bryr dig om användarvänlighet kan du dessutom implementera HTTP Basic eller klientcertifikatautentisering, då behöver du inte implementera autentisering i själva webbapplikationen.
Webbserverloggar och proxyloggar, period, primära skäl att POSTA denna information och inte FÅ den.Allt jdow och tlng05 säger är också sant, men loggar är det främsta "oops där det är" med HTTP (S) GET.
Din administratör på något forum: "Hej, jag har det här problemet med min webbplats administratörspanel. Du kan se det här: http://exempel.com/category.php?catID=admin&pageNumber=hunter2
"* Fält kommer att vara okända förväntas för administratörer själva *" - Jag är inte säker på vad du menar med det.Är de dynamiskt genererade?Eller föreslår du "? Mitt användarnamn = mitt lösenord"?Varför kunde du inte göra detsamma med POST?
"POST" kontra "GET" är inte en stor *** stötesten i vägen för hackare, men det hjälper.Varje liten bit ... hjälper
Din större oro är att du använder HTTPS eller HTTP.Om du bara använder HTTP;POST eller GET är lika öppna för MITM.Om du säkrar kanalen (vilket du borde vara) så är [GET lite mindre säker.] (Http://stackoverflow.com/questions/4143196/is-get-data-also-encrypted-in-https)
_Men på grund av fältnamn är kända kan en hackare försöka knäcka lösenorden även om vissa säkerhetsmetoder är implementerade_ - Detsamma gäller för en konventionell GET-begäran.Men ingen anledning att du inte kan använda dynamiskt genererade fältnamn.lagra en uppslagning av vilken är vilken på servern.Hjälper inte massivt till säkerhet men kommer att göra livet till en känsla svårare för hackarna.
GET-förfrågningar lagras också i HISTORY i webbläsaren - det är ett enkelt mål för nästan alla som lyckas komma in på din dator i 15-20 sekunder ..
Och att sätta användarnamn och lösenord i en GET-begäran kan göra dem synliga i webbläsarens adressfält, beroende på URL-längden, vilket kan vara ett problem om någon var tillräckligt nära för att se din skärm.
Varför inte använda den auktoriseringsmetod som vi redan har i webbadresser?`https: // användare: pass@example.com /`.På det här sättet kan du länka till något som kräver autentisering, men den faktiska autentiseringsprocessen görs via förfrågningsrubriker och visas vanligtvis inte i en logg.
"fältnamn är kända": det spelar ingen roll om du inte använder svaga lösenord."administratörer behöver inte användarvänlig inloggning": Ange sedan autentisering via din webbserver (t.ex. apache).Du kan antingen använda grundläggande autentisering och lagra lösenord i webbläsaren (med huvudnyckel) eller installera klientcertifikat i webbläsare (inga lösenord behövs).Hur som helst, det är mycket säkrare än att använda GET.
Om du bryr dig om specifikationer rekommenderar http speciellt starkt att GET-variabler endast ska användas för hämtning, inte för att ändra tillståndet för din applikation.Bortsett från säkerhetshänsynen bakom detta kan det _ vara_ en faktor om du kodar måste certifieras för någon ISO-sak eller liknande som kräver standardöverensstämmelse.
GET är mycket mottagligt för [förfalskning på flera sidor] (https://en.wikipedia.org/wiki/Cross-site_request_forgery) t.ex.via bilder.Även om det inte är uppenbart för mig hur någon kan dra nytta av detta, är det bäst att undvika åtgärder som ger ett resultat på servern (i det här fallet loggar in) genom en GET.Att inte veta hur något kan vara en vektor för attack betyder inte att det inte är en.Undvik problematiska tillvägagångssätt som strider mot RFC.
Nio svar:
jdow
2017-01-04 09:29:50 UTC
view on stackexchange narkive permalink

Detta sparar inloggningslänken med lösenord och användarnamn i webbläsarhistoriken. Det kan också av misstag fångas av saker som brandväggsloggar, som inte skulle fånga inläggsvariabler.

Dessutom passerar människor webbadresser med parametrar överallt (tänk dig din fråga, med användarnamn och lösenordsparametrar, visas på stackexchange).Detta kan också öppna dig för CSRF-attacker.
Och även om du använder HTTPS finns det fortfarande många webbläsartillägg som samlar hela webbadressen till sidan du besöker.[WOT] (https://lifehacker.com/web-of-trust-sells-your-browsing-history-uninstall-it-1788667989) är ett senaste exempel som fick mycket publicitet, men det finns och har funnits andra.
Jag kommer ihåg en webbplats som gjorde en korrekt autentisering, men som sedan genererade en sessionsnyckel som den inbäddade (GET-stil) i webbadressen.Var ganska benägen för denna URL-delning, eftersom fler människor märker `? User = me & password = letmein` men`? Sess = 012345678` är mindre uppenbart ett problem.
Om du använder Google Chrome skickas din webbhistorik också till Google som standard.
tlng05
2017-01-04 09:51:04 UTC
view on stackexchange narkive permalink

Jag kan tänka mig en hel del anledningar till varför detta inte skulle vara idealiskt:

  • I kodavsnittet som du publicerade kodar du nu in en hemlig nyckel i programmets källkod. Detta är dåligt, för om du nu vill publicera eller dela din källkod med någon annan måste du komma ihåg att ändra den nyckeln. Säkerheten i ett system borde inte vara beroende av att dess källkod förblir dold.
  • Detta skalas inte bra. Om du bara har en hemlig nyckel som alla administratörer måste dela blir det mycket lättare att läcka av misstag. Om det läcker, skulle du inte ha något sätt att veta vem som var ansvarig för att läcka det. Du kan ge en annan nyckel till varje administratör, men det blir rörigt mycket snabbt.
  • Du kan inte ändra nyckeln enkelt. Generellt sett kommer du troligtvis att behöva ha webbplatsadministratörer som inte också är serveroperatörer. Men med den här inställningen kan du inte ge någon möjlighet att ändra nyckeln utan att också ge åtkomst till källkoden och servern, som de kanske eller inte vet hur man använder handtaget. Att justera källkoden som körs i ett produktionssystem willy-nilly är felbenägen och kommer sannolikt att leda till stillestånd.
  • Eftersom du använder GET är det väldigt enkelt för nyckeln att läcka genom webbläsarhistorik eller av misstag länkdelning.
  • Det är inte särskilt användarvänligt. Att använda detta kräver att man vet hur man manuellt manipulerar en specifik GET-parameter. Du säger att användarvänlighet för administratörer inte behövs, men detta är definitivt inte sant i allmänhet. Hela din webbplats ska vara så användarvänlig som möjligt, inklusive administratörspanelen.

Sammanfattningsvis kan jag se att den här typen av system används som en tillfällig åtgärd på en liten webbplats, där det finns en webbplatsadministratör som också skrev webbplatsens källkod och hanterar servern. Men allt som är större än det, du vill ha en faktisk administratörsinloggningspanel, med hashade och saltade referenser lagrade i databasen som alla andra användare.

När det gäller punkt 2: att ge olika nycklar till varje administratör är inte riktigt så rörigt.Hemlig delning är faktiskt ganska enkel.
@Mego Jag menade främst rörigt i termer av kod.vad händer t.ex. när du vill tilldela olika behörighetsnivåer eller lägga till / ta bort administratörer.Detta leder också till den tredje punkten.
AbraCadaver
2017-01-04 20:42:06 UTC
view on stackexchange narkive permalink

Inte strikt ur säkerhetssynpunkt, men Hypertext Transfer Protocol - HTTP / 1.1 RFC 2616 gör det helt klart:

... konventionen har varit fastställt att GET- och HEAD-metoderna INTE FÅR betydelsen av att vidta en annan åtgärd än att hämta . Dessa metoder bör betraktas som "säkra". Detta gör det möjligt för användaragenter att representera andra metoder, som POST, PUT och DELETE, på ett speciellt sätt så att användaren blir medveten om att en eventuellt osäker åtgärd begärs.

GET bör endast användas för hämtning. I ditt fall skickar du data till servern, servern utför dessa specifika åtgärder (åtminstone):

  • Autentisering av en användare
  • Skapa en session att spåra användartillstånd (PHP skapar sessionsdata i platta filer eller en databas)
  • Att ställa in en session-cookie för att spåra sessionen

POST via HTTPS skulle vara den föredragna metoden att överföra känslig data; användarnamn, lösenord i det här fallet.

GET-operationer bör vara idempotenta, vilket innebär att du kan utföra operationen om och om igen säkert.Med andra ord * ändrar du inte * någonting på servern ... du levererar helt enkelt de uppgifter som krävs för att begära en specifik resurs (i det här fallet en autentiserad sida).För allt annat än en statisk HTML-webbplats kommer en GET-begäran nästan alltid att utföra åtgärder av betydelse (t.ex. www.mystore.com/product.php?productid=123 måste fortfarande bygga och visa produktsidan).Att använda GET för känslig data är verkligen en MYCKET dålig idé, men inte nödvändigtvis på grund av RFC 2616.
@DVK: Det är en mycket bra anledning, även om det finns andra som beskrivs i andra svar.När du loggar in och startar en session (i PHP) finns det flera ändringar på servern, och din session är ihållande över sidor.
@DVK GET-operationer borde inte bara vara idempotenta, de borde vara rena (vilket jag tror är vad du menade).Att vara idempotent innebär att göra det två gånger har samma biverkningar som att göra det en gång.Att vara ren innebär att göra det en gång har samma biverkningar som att inte göra det alls.Som jämförelse är DELETE idempotent, men inte rent.
@James_pic "Att vara ren betyder att göra det en gång har samma biverkningar som att inte göra det alls."När vi pratar om betydelse pratar vi om resurser, inte anrop av processer på serversidan som är nödvändiga för att hämta resursen.Att logga in har verkligen inga biverkningar när det gäller resurser.Det skapar, tar inte bort eller ändrar en resurs.Den tillhandahåller de data som behövs (i detta fall autentiseringsinformation) för att lokalisera och visa resursen, inte annorlunda än? Productid = 123 gör.Den största skillnaden är att RFC anger att känslig information INTE ska finnas i GET.
@AbraCadaver Nästan alla dynamiska webbplatser kommer att åberopa ändringar på servern för alla förfrågningar oavsett om du autentiserar eller inte.Vikten är att du inte gör någonting med själva de underliggande resurserna.Alla ändringar på serversidan är bara tillfälliga för att visa resursen.En användare som loggar in eller inte loggar in (eller loggar in 9 gånger) har i allmänhet ingen inverkan på de resurser de försöker komma åt, så jag skulle hävda att inloggning är ren (säker).Om skapande av en session utesluter användning av GET, kan GET i princip bara användas för statiska resurser.
@DVK: Avslutande verkar ** INTE ** och ** annat än hämtning ** verkar ganska rakt framåt.När du loggar in ändrar åtgärden status från inte autentiserad till autentiserad och möjligen åtkomst till ytterligare data och / eller åtgärder.
Regeln är inte att GET inte ska göra något åt resurserna.Regeln är att GET inte ska förstås som en begäran från klienten att göra någonting - allt som händer händer eftersom servern bestämde att den ville göra det, och klienten borde inte vara ansvarig för det.
Andy Holland
2017-01-04 17:40:34 UTC
view on stackexchange narkive permalink

Hur bekväm är du med att lagra administratörslösenord i klartext i dina webbserveråtkomstloggar?

Problemet jag ser här är att en GET-begäran måste lägga alla fältnamn och värden i URI för begäran. Begärda URI: er loggas av alla slags processer och kommer sannolikt att sparas i sin helhet i webbserverns åtkomstlogg.

Det betyder att din webbserveråtkomstlogg ökar säkerhetsrisken eftersom den nu innehåller användarnamnen och lösenorden för GET-baserade inloggningssidor. Även om du i allmänhet kan behandla serverloggar som innehåller privilegierad information (till exempel din kunds IP: er), är de vanligtvis inte så känsliga att de innehåller tillräckligt med information för att äventyra en klients administrativa gränssnitt. eftersom fältnamnen och värdena inte lagras i loggen.

Machavity
2017-01-05 00:04:25 UTC
view on stackexchange narkive permalink

En skadlig användare får administratörsuppgifter. Använda en bildtagg

  <img src = "https://exempel.com/login?username=admin&amp;password=topsecret" style = "display: none" >  

de lurar din webbläsare att logga in (bilder är inte föremål för gränsöverskridande begränsningar som standard). De kan sedan använda en serie "bild" -samtal för att få eller ändra data (många AJAX-samtal använder GET felaktigt också). Det finns sätt att undvika detta, men de flesta aktiverar inte dem. Om du använder POST fungerar inte denna attackvektor.

Fältnyckel är okänd, hur kan en angripare gissa det?
Som nämnts någon annanstans kan du hämta detta från en webbläsare eller så kan det delas av en användare.Säkerhet genom dunkel varar bara så länge som dina användare bryr sig om det.
@AmirrezaNasiri om det finns ett offentligt synligt inloggningsformulär med GET, hur kan lösenordsfältets namn vara okänt?
Jag tror att @AmirrezaNasiri föreslår att det inte skulle finnas någon synlig form - istället skulle administratörer bara veta hur man skriver få parametrar i adressfältet.
Lucas
2017-01-04 18:11:21 UTC
view on stackexchange narkive permalink

Problemet med att använda get-metoden är att data kommer att synas på skärmen och i webbserverloggarna som standard.

Min tumregel är att använda post för lösenord och stor information som bloggartikel redaktörer och användning får för mest allt annat. Naturligtvis finns det några undantag där data är för känsliga för att kunna visas även i loggarna. Men de är sällsynta även i företagssektorn.

Till exempel har jag en guide som funktionalitet med fem steg där jag genererar ett process-ID i första steget och i varje steg ser du ? proc_id = 123 . PHP stöder frågesträngen även i inläggsmetoder. Även i ett steg där formulärdata är för stora och jag tvingas använda postmetoden blir process-id fortfarande synligt i webbadressen som ?proc_id=123.

Detta gör det lättare att bokmärka saker, lättare att förstå åtkomstloggarna, och mer lärorik för tredje parter som vill integrera med mina appar.

Vissa försiktighetsåtgärder måste vidtas i det scenariot för att undvika problem med bakåtknappen såsom att rensa från historik-URL: er som inte får skickas igen. De flesta spara åtgärder är så.

Naturligtvis skyddar POST dig inte från en MiTM-attack. Det förhindrar endast känslig information som lösenord att skrivas i loggarna på din webbplats och i webbläsarens lokala historia.

Andre Geddert
2017-01-04 22:04:00 UTC
view on stackexchange narkive permalink

Tänk också på att GET-Requests är avsedda att inte ändra någonting på serversidan. En tillståndsändring som "utloggad" -> "inloggad" måste alltid göras med en POST-begäran.

Att ha en GET-parameter som

  https: / /exempel.com/loginpage.php?password=topsecret 

är semantiskt exakt samma som

  https://example.com/loginpage/password / topsecret 

Så det finns ingen autentisering alls. Det är bara en "hemlig" URL som du måste veta för att "logga in".

För att göra det tydligare. Om du till exempel använder Apache kan du få samma resultat med en omdirigering så här:

 RedirectTemp-lösenord / topsecret mycketobfuscateddirectoryname / inloggad 

och placera sedan din session_start ()

Leo Wilson
2017-01-07 21:55:20 UTC
view on stackexchange narkive permalink

Även om användaren och lösenordet inte lagrades i webbläsarens historik (vilket de är, som URL-parametrar) gör det det extremt enkelt för alla hackare att stjäla din information. Det kommer att visas i serverns loggar, det gör det ännu lättare att utföra en man-i-mitten-attack. Det möjliggör också mycket dålig praxis, som att människor bokmärker inloggnings-URL: n, glömmer bort det och låter andra människor använda sin webbläsare.

TL; DR: Det här är en hemsk idé.

bdsl
2017-01-07 05:44:37 UTC
view on stackexchange narkive permalink

Ja, det är dålig praxis. Alla säkerhetsfördelar som är tillgängliga genom att ha ett hemligt fältnamn kan också uppnås genom att förlänga den hemligheten till lösenordet. >

det vore bättre att använda POST med

  lösenord = elephantrthg4e5sdc  

Och naturligtvis kan du öka säkerheten igen genom att ändra det till något mer som

  lösenord = ehu3dva7rthg4e5sdc  


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...