A biztonság jó dolog.
Csak épp néha piszokul bosszantó.
Vegyük elő kedvenc Outlookunkat és tapasztalni fogjuk, hogy a beérkezett levelek egy jó részében nincsenek képek, csak egy kék figyelmeztető sáv, hogy ha akarjuk, akkor letölthetjük a képeket, de ez biztonságilag kockázatos.
Miért van ez így? Miért van az, hogy bizonyos levelekben vannak képek és bizonyos levelekben nincsenek?
A HTML formátumú levelekbe a képeket két módszer szerint tudjuk berakni.
Az egyik az úgy nevezett Online HTML. Ebben az esetben a levélben van egy img tag, aminek az src attributuma egy web szerveren tárolt képre mutat. Ennek a megoldásnak az az előnye, hogy az elküldött levél maga viszonylag kicsi lesz, mert a képek nincsenek benne. További előny, hogy a küldő tud a háttérben statisztikát vezetni arról, hogy az adott levelet megnyitották-e (ha letöltötte a címzett a képet, akkor megnyitotta a levelet). Előny lehet még a feladó számára, hogy a képet utólag is tudja módosítani*. Ennek a megoldásnak vannak hátrányai is. Az Outlook az ilyen levelekre rakja fel a fent említett kék csíkot és nem tölti le a képeket. Ha valamiért a címzett, vagy a küldő web szervere offline, akkor nem tudunk hozzáférni a képekhez.
A másik az Offline HTML, amelyben az img tag src attributuma egy cid bejegyzést tartalmaz ami a levélben magában lévő rejtett csatolmányra mutat. Ez tartalmazza a képet magát. Előnye, hogy mindig elérhető a címzett számára, az Outlook nem szűri ki, ugyanakkor hátránya, hogy nagyméretűek lesznek a levelek tőle.
Vajon az Outlook miért szűri ki az első levél típusban szereplő képeket?
Mert ez a gépre nézve potenciális támadást is hordozhat. Az elmúlt években több olyan sérülékenység is napvilágra került, amit a Windows képfeldolgozó motorjában találtak és speciálisan formázott képfájlal kihasználhatóak voltak. Tehát, ha nem töltöm le a képet, akkor nem tud kárt okozni.
De engem zavar, hogy állandóan kézzel kell letöltenem a levelet. Ki lehet kapcsolni?
Igen, de nem érdemes, az ok az előbb taglalt biztonság.
Jó, de akkor mi a megoldás? Hogyan lehetne elérni, hogy azoknál a leveleknél, amiknél én szeretném automatikusan letöltődjenek a képek (pl. rendszeres, olvasott hírlevelek).
Erre van megoldás. Ha megnézzük az Outlook biztonsági beállításai között találunk egy ilyet:
Bekarikáztam a lényeget. Tehát, ha a kép forrását berakjuk az Internet Explorer Trusted Zone-ba akkor a képet automatikusan le tudjuk tölteni.
Ok. Akkor rakjuk be. Na, ezzel lesz némi gond. Nincs olyan gomb, menü, valami az Outlookban, ami ezt megtenné nekünk. Ha van egy levelünk, aminek a linkjeit használni szeretnék, akkor szükségünk lenne a levél HTML forrására, hogy ki tudjuk másolni a megfelelő linket. Sajnos ezzel sem rendelkezünk, ugyanis ezt az Outlook eldugja előlünk.
Mit tehetünk? Programozunk.
Írtam egy pici Outlook makrót, ami beköltözik a levél context menüjébe és ha ott rábökünk a Trust Picture Source menüpontra, akkor a levélben (vagy levelekben) lévő img src attributumokból kibogarássza a web oldalak címeit és berakja őket a Trusted Zone-ba.
A dolog működik, csak egyetlen szépséghibája van. A működés eredménye, csak az Outlook újraindítása után látható. A kód Outlook 2007-en működik (a korábbiakon nem).
Akkor rakjuk fel!
Nyissunk az Outlookban egy VBA ablakot (Alt+F11) A ThisOutlookSession-on jobb egérgomb, View Code.
Ide másoljuk be ezt:
Option Explicit
Private TrustPictureContextMenus As TrustPicturesMenu
Private WithEvents objOL As Outlook.Application
Private Sub Application_Quit()
Set TrustPictureContextMenus = Nothing
End Sub
Private Sub Application_Startup()
Set TrustPictureContextMenus = New TrustPicturesMenu
End Sub
Ezek után a Class Modules ágon jobb egérgomb, Insert/Class Module. Majd a keletkezett modult nevezzük át TrustPicturesMenu-re.
A kód ablakba pedig rakjuk be ezt:
Option Explicit
Private WithEvents objOL As Outlook.Application
Private WithEvents objTrustPictureButton As Office.CommandBarButton
Private Sub Class_Initialize()
Set objOL = Outlook.Application
End Sub
Private Sub objTrustPictureButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
Dim RE As Object, REMatches As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = False
.Global = True
.IgnoreCase = True
.Pattern = "<img\b[^>]*src=""(https?)://([^/]*)[^""]*""[^>]*>"
End With
ReDim Sites(1, 0) As String
Dim objItem
Dim SiteFound As String
Dim ProtocolFound As String
Dim SiteInArr As Boolean
Dim SiteMatch
Dim Site
Dim i
For Each objItem In objOL.ActiveExplorer.Selection
Set REMatches = RE.Execute(objItem.HTMLBody)
For Each SiteMatch In REMatches
SiteFound = LCase(SiteMatch.SubMatches(1))
ProtocolFound = LCase(SiteMatch.SubMatches(0))
SiteInArr = False
For i = 0 To UBound(Sites, 2)
If Sites(0, i) = SiteFound And Sites(1, i) = ProtocolFound Then
SiteInArr = True
Exit For
End If
Next
If Not SiteInArr Then
If Sites(0, UBound(Sites, 2)) <> "" Then
ReDim Preserve Sites(1, UBound(Sites, 2) + 1)
End If
Sites(0, UBound(Sites, 2)) = SiteFound
Sites(1, UBound(Sites, 2)) = ProtocolFound
End If
Next
Next
Dim DomainPartArr
Dim HostPart As String
Dim DomainPart As String
Dim j, k
For i = 0 To UBound(Sites, 2)
DomainPartArr = Split(Sites(0, i), ".")
DomainPart = ""
HostPart = ""
For j = 0 To UBound(DomainPartArr) - 2
HostPart = HostPart + DomainPartArr(j)
If j < UBound(DomainPartArr) - 2 Then
HostPart = HostPart + "."
End If
Next
For k = j To UBound(DomainPartArr)
DomainPart = DomainPart + DomainPartArr(k)
If k < UBound(DomainPartArr) Then
DomainPart = DomainPart + "."
End If
Next
RegKeySave "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\" _
& DomainPart & "\" & HostPart & "\" & Sites(1, i), 2, "REG_DWORD"
Next
End Sub
Sub RegKeySave(i_RegKey As String, i_Value, Optional i_Type As String = "REG_SZ")
Dim myWS As Object
Set myWS = CreateObject("WScript.Shell")
myWS.RegWrite i_RegKey, i_Value, i_Type
End Sub
Private Sub objOL_ItemContextMenuDisplay(ByVal CommandBar As Office.CommandBar, ByVal Selection As Selection)
Dim objItem As Object
Dim blnFoundItem As Boolean
Dim objCBB As Office.CommandBarButton
For Each objItem In Selection
If objItem.Class = olMail Or objItem.Class = olPost Then
blnFoundItem = True
Exit For
End If
Next
If blnFoundItem = True Then
Set objCBB = CommandBar.Controls.Item(1)
objCBB.BeginGroup = True
Set objCBB = CommandBar.Controls.Add(msoControlButton, , , , True)
objCBB.Style = msoButtonWrapCaption
objCBB.Caption = "Trust Picture Source"
objCBB.BeginGroup = True
Set objTrustPictureButton = objCBB
End If
End Sub
Mentsük el az egészet.
Ezek után, már csak a kód biztonsági beállításokat kell megtennünk, hogy a dolog működjön (digitális aláírás, miegymás 🙂 )
Használata:
Odanavigálunk kiszemelt levelünkhöz, nyomunk rajta egy jobb egérgomot és…
* Erről van egy történetem. Van egy ismerősöm, aki az egyik magyar banknál dolgozott biztonsági szakértőként. Egy spammer banda az ő bankjuk nevében küldött megtévesztő leveleket (phishing). A rosszfiúk elkövették azt a hibát, hogy Online HTML levelet küldtek, amiben a logo a bank honlapjára mutatott. Az ismerősöm fogta magát és kicserélte a logót a honlapon egy figyelmezetésre, melyben jelezte, hogy a levél hamis és a tartalmát senki se vegye figyelembe.
Recent Comments