Ist es möglich, ein Programm zu schreiben, das die auf dem Computer installierten Schriftarten maskiert, sodass die Schriftartenliste "plain vanilla" erscheint und keinen großen Wert für die Erstellung eines eindeutigen Fingerabdrucks hat? https://panopticlick.eff.org/möglich, Browser-Fingerabdruck zu vereiteln, indem Sie eine gefälschte Liste installierter Schriften zurückgeben?
Antwort
Es gibt wahrscheinlich einige Unterstützung dafür in einigen Browsern, aber mit jedem Browser konnten Sie die winapi Aufrufe für die Aufzählung der Schriftartenliste abfangen.
Im Grunde schreiben Sie eine DLL, die in den Browser-Prozess geladen wird, und dann wird es die Aufrufe abfangen, die der Browser an das Betriebssystem vornehmen wird, wenn es Schriften auflistet. Suchen Sie einfach nach den Funktionen in Windows, die zum Aufzählen von Zeichensätzen verwendet werden, und fälschen Sie diese in Ihrer DLL. (Das könnte aber etwas Arbeit sein, da Sie die Schriften-Aufzählungslogik neu schreiben müssen).
Auch einige der Browser können sehr gut nur die Registrierung lesen, um Schriften aufzulisten, und nicht die spezialisierten fontfunctions verwenden, in diesem Fall müssen Sie die Registry-Winapi-Funktionen abfangen und sicherstellen, dass sie die Schriftartenliste melden das du willst.
Zum Laden Ihrer DLL in den Zielprozess können Sie Windows-Hooks verwenden oder einen .exe-Dateieditor verwenden, um Ihre DLL zur Importtabelle der exe-Datei des Browsers hinzuzufügen. Es gibt auch einen speziellen Ort in der Registrierung, wo, wenn Sie dort eine DLL hinzufügen, wird es zu jedem Prozess im System geladen werden. (Dann müssen Sie nach dem Browserprozess suchen und nur api-Aufrufe abfangen, so dass nicht jedes Programm auf Ihrem System die falsche Font-Liste bekommt).
Es ist auch möglich, dass ein Browser ein Plugin, oder ActiveX-Steuerelement, oder Java, oder etwas ähnliches in einem anderen Prozess ausführt (Chrome führt jeden Tab in verschiedenen Prozessen aus), also würde ich jeden Prozess überprüfen ' Übergeordnet, und wenn Sie sehen, dass es vom Browser gestartet wurde, abfangen die Schriftartenliste in diesem Prozess auch. Auf diese Weise wird die Zielwebpage nicht in der Lage sein, die echte Schriftartenliste durch Flash, Plugins, Java oder irgendetwas zu erhalten. http://www.codeproject.com/KB/system/InterceptWinAPICalls.aspx
Das ist so ein zuverlässiger Weg, dies zu tun, und obwohl es nicht in einer Stunde getan werden kann, ist es nicht übermäßig entweder kompliziert:
Ein guter Start in winapi Anrufe abfangen kann hier gefunden werden.
Natürlich macht dies nicht nur Ihre Font-Liste gefälscht, es wird auch den Browser nicht sehen und in der Lage sein, die Schriften anzuzeigen, die nicht in der Liste sind.
Und das alles gilt natürlich für Windows, aber es gibt sicherlich ähnliche Möglichkeiten, dies auf anderen Betriebssystemen zu tun.
Auch erwähnenswert, ich glaube nicht, dass eine Webseite die Schriftenliste lesen kann, wenn Sie Javascript und Plugins (Flash) deaktiviert haben.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Font detector</title>
<style type="text/css" media="screen">
#font_detector_box{ visibility: hidden; }
#font_detector_box span.font{ padding: 0px; margin: 0px; border: none; font-size: 10px; letter-spacing: 1px; }
</style>
</head>
<body>
<h1>Font Detection Page</h1>
<p>This page is a sample for font detection tecniques</p>
<h2>List of fonts installed on your machine</h2>
<span id="font_list_display">
</span>
<!-- Invisible div -->
<div id="font_detector_box">
<span class="font family_Arial" style="font-family: Arial, Verdana !important">mmm</span>
<span class="font family_Comics_Sans_MS" style="font-family: Comic Sans MS, Arial !important">mmm</span>
<span class="font family_Georgia" style="font-family: Georgia, Arial !important">mmm</span>
<span class="font family_Helvetica" style="font-family: Helvetica, Verdana !important">mmm</span>
<span class="font family_Verdana" style="font-family: Verdana, Arial !important">mmm</span>
<span class="font family_Times_New_Roman" style="font-family: Times New Roman, Arial !important">mmm</span>
</div>
</body>
<script type="text/javascript"src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
<script type="text/javascript">
var fontMeasures = new Array();
//Web safe
fontMeasures["Arial"] = new Array("30px", "13px");
fontMeasures["Comics_Sans_MS"] = new Array("27px" , "14px");
fontMeasures["Georgia"] = new Array("33px" , "13px");
fontMeasures["Helvetica"] = new Array("30px" , "13px");
fontMeasures["Verdana"] = new Array("36px" , "12px");
fontMeasures["Times_New_Roman"] = new Array("27px" , "12px");
var msg = "";
$(".font" , "#font_detector_box").each(function(){
var fontFamily = $(this).attr("class").toString().replace("font " , "").replace("family_" , "");
var width = $(this).css("width");
var height = $(this).css("height");
//alert(width + height);
if(fontMeasures[fontFamily][0] === width && fontMeasures[fontFamily][1] === height){
var family = fontFamily.replace(/_/g , " ");
msg += '<span class="font-family: '+ family + ';">' + family + '</span> <br/>';
}
});
$("#font_list_display").html(msg);
</script>
</html>
Vielen Dank für den Link und für die verschiedenen Möglichkeiten, wie die Font-Liste zusammengestellt werden kann. – Tim
Würde nicht nur die Server-Anfrage mit einem Browser-Plugin wie TamperData bearbeitet? – AbdullahC