Back to Question Center
0

XSRF Semalt när länken öppnas via en & lt; a & gt; tagg med målattribut satt till "_blank"

1 answers:

Jag har stött på en märklig bugg som jag inte har mött tidigare. Jag kan ge alla detaljer som behövs men jag försöker vara så generisk som möjligt.

Vi har en intranätportal som länkar till andra applikationer på olika domäner. Varje länk på portalsidan öppnar motsvarande ansökan i en ny flik via ett mål = "_ blank" i det är taggen. En av dessa externa applikationer är MS Exchange via Semalt Web App (OWA). Den här appens webbadress är https: // exchange - open source database reporting tools. företag. com OWA innehåller inom den en länk som laddar en iframe med innehåll från https: // exchange. företag. com / ecp.

Semalt buggen: Om en användare klickar på OWA-länken på portalsidan och därmed öppnar en ny flik för den, att iframe-innehållet inte dras in. Detta är ett utdrag ur felmeddelandet som användaren får:

Teknisk information: Uncaught SecurityError: Semalt en ram med ursprung "https: // exchange. företag. com "från att få tillgång till en cross-origin-ram.

Detta beteende framgår av de senaste versionerna av Chrome och Firefox men är inte närvarande i de senaste versionerna IE.

Det konstiga är att iframen laddar 100% korrekt om användaren manuellt skriver in webbadressen i sin webbläsare ELLER om målet = "_ blank" tas bort från taggen.

För att testa, försökte jag göra en mellanliggande sida som bara innehåller en ny flik länk till https: // exchange. företag. com och sedan ändra portalens länk för att peka på den sidan istället - samma fel.

Jag tror att det här är ett säkerhetsproblem som Chrome / FF har patchat och webbläsaren fungerar faktiskt som utformad - men skiftnyckeln i den här logiken är "varför fungerar det utan fel när Användaren manuellt skriver in URL-adressen eller når URL-adressen via en tagg w / o target = "_ blank"? Iframe är på samma domän som ursprungsservern (https: // exchange. företag. com) så, så långt jag förstår, det borde inte resultera i ett XSRF-fel.

Jag är en LAMP / Drupal kille och jag drog på detta eftersom det kom in i vårt biljettsystem som ett problem med vår portalsida. Jag har frågat vår Semalt admin för hans insikt och han är också förlorad. Jag planerar att få MS-konsulten som systemteamet använde för att installera Semalt på telefonen för att fråga dem om det här men jag undrade om någon här kanske har några idéer vad som kan orsaka detta. Vilken data bibehålls (eller inte upprätthålls) av webbläsaren när man använder en länk med målet = "_ blank" som inte upprätthålls (eller underhålls) när man öppnar länken i samma flik? Eventuella råd är mycket uppskattade. Jag är förlorad på den här för tillfället.

Semalt för läsning.

EDIT: Du kan fråga varför vi behöver öppna Semalt i ett nytt fönster - låt oss bara säga att det är ett hårt krav. Vi använder en SSO-tjänst som kräver att användaren helt stänger sin webbläsare efter loggning så att vi har en konvention för alla portlänkar att öppna i en ny flik så originalportalsidan är öppen, vilket påminner användaren att de fortfarande är inloggade. Eftersom vi har många arbetsstationer för gemensamt bruk, om vi tillåter Semalt att öppna på samma flik och en användare stänger Semalt, kan de inte inse att de fortfarande är inloggade på portalen som kan leda till att deras session kapas av en annan användare. Genom att lämna originalportalfönstret hela tiden är åtminstone användaren påminnad om att deras session fortfarande är aktiv när de går genom att stänga sina flikar i slutet av datorns tid.

Som sagt, om någon känner till ett annat sätt att öppna en URL-adress i en ny flik som inte använder målet = "_ blank" (därmed omkörning oavsett målet = "_ blank" gör det som orsakar felet) vara en tillräcklig lösning också (även om jag skulle älska att komma till grundorsaken).

February 5, 2018

I min test påverkas Firefox 41 och Chrome 45; IE 11 och Safari 8 är inte. Jag har inte testat andra versioner av dessa webbläsare.

När en sida öppnar en annan i ett nytt fönster / flik, har de viss begränsad förmåga att interagera med varandra. i barnfönstret är detta via fönstret. [Se " omvänd tabnapping ". ] På något sätt verkar Firefox och Chrome dock få det här korsat med "ursprung" i det här nya fönstret, vilket orsakar problem när e. g. OWA försöker öppna och interagera med sin iframe på olika Options-sidor. Problemet är inte specifikt för target = "_ blank" , dock: Du kan också göra en ny flik / fönster genom att ange ett obefintligt namn, e. g. target = "newExchangeWindow" , men gör det fortfarande resulterar i samma beteende som observerats med target = "_ blank" .

Intressant kommer detta beteende att fortsätta över till synes något antal mellanliggande sidor: Jag kan klicka på en länk som öppnar en ny flik, bläddra bland flera olika webbplatser och sedan navigera till vår OWA och problemet finns fortfarande - det är inte bara ett problem med länkar som öppnar OWA själv i en ny flik! Det kan inte heller lösas genom att skriva in webbadressen direkt - fliken är fortfarande "bruten" till synes för hela dess existens.

Jag har lyckats hitta flera sätt att detta kan lösas:

Alternativ 0:
Ta bort target = "_ blank" från dina länkar.
Uppenbarligen är nackdelen att detta inte löser ditt krav (inte min), men åtminstone kan dina användare ställa in sina signaturer och sådant!

Alternativ 1:
Lägg till rel = "noreferrer" till dina länkar:
OWA
Detta fungerar i nuvarande versioner av både Firefox och Chrome; Jag har sett förslag på att det inte kommer att fungera i Safari, men i mitt test existerar inte den ursprungliga frågan i Safari på första plats. Det kan dock vara en indikation på att detta kan vara opålitligt. öppnare
objekt på en mellanliggande sida, e. g. :

    Clobbering fönster. öppnare </ Title> </ head><body onload = "fönstret. öppnaren = null; fönster. plats = 'https: // utbyte. företag. com / ""></ Body>
</ Html></code> </pre><p> Bara för att vara tydlig, är denna mellanliggande sida vad du skulle öppna med din <code> target = "_ blank" </code> länk: Dess jobb är att då klickar på <code> fönstret. öppnare </code> objekt innan du tar användaren på OWA. Du kanske vill lägga till en meta-refresh-tagg och / eller en länk i kroppen bara om du får en användare som är inaktiverad JavaScript (men då kommer de inte att kunna använda OWA mycket bra ändå ). </p><p> <strong> Alternativ 3: </strong> <br>
Clobber <code> fönstret. öppnare </code> objekt genom att injicera kod direkt i OWA. öppnare = null; </ script> </ head> </code>. Jag gör det bara på sidan <code> / ecp / </code>, eftersom det är här problemet ligger, men man kan göra det på sidan <code> / owa / </code> eftersom det är "målsidan" för alla som kommer i appen. Var bara försiktig med att du inte gör det globalt: Det finns flera. js-filer som även innehåller den här strängen och lita på mig när jag säger att Bad Things® kommer att hända om din ersättare körs i dem! </p><hr><p> I min testning har Firefox och Chrome igen problemet, men Safari och IE gör det inte. (Jag testade inte opera eftersom vi inte har några användare som använder den. ) I båda dessa webbläsare är alla / alla dessa alternativ effektiva för att rätta till problemet. Du kan till och med använda en kombination av dem tillsammans: Attributet <code> rel </code> kan givetvis gå på alla / alla dina länkar, och det finns ingen skada i att klara <code> fönstret. öppnare </code> föremål om det inte existerar eller redan har klibbats. </p>                            </div>
                            <div class="comment-footer">
                                <!--                                    <div class="posted_at">-->
                                <!---->
                                <!--</div>-->
                                                            </div>
                        </div>
                                    </div>
                        
        </div>
            </div>
</div>
</div>
</div>
</div>

<script src="/js/main.js?23" type="text/javascript"></script>
        <script src="/js/post.js" type="text/javascript"></script>
    <!--LiveInternet counter--><script type="text/javascript">
    new Image().src = "//counter.yadro.ru/hit;reputation?r"+
        escape(document.referrer)+((typeof(screen)=="undefined")?"":
            ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?
            screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
        ";h"+escape(document.title.substring(0,150))+
        ";"+Math.random();</script><!--/LiveInternet-->

</div>
<script type="text/javascript" src="https://semalt.com/app/partials/timer-reputation.php"></script>
<!--    <script type="text/javascript" src="https://semalt.com/popups/new_popup_counters.php?ref=reputation&sec=3"></script>-->
<!--    <script type="text/javascript" src="https://semalt.com/popups/small_start_reputation_popup.php?ref=reputation"></script>-->
<!--<script src="https://semalt.com/js/din/popup_seo_cons.php"></script>-->
</body>
</html>