Donnerstag, 3. Oktober 2019

Thunderbird: Weißer Pfeil im grüner Kreis

Weißer Pfeil im grüner Kreis in Thunderbird oben rechts neben Kalender Tab Button und Aufgaben Tab Button.

Der Button Grüner Kreis mit weißer Pfeil kann nicht angeklickt werden und hat kein rechte Maustaste Kontextmenü.

Was bedeutet in Thunderbird der Grüner Pfeil?

Thunderbird Grüner Pfeil Weißer Pfeil Grüner Kreis
Thunderbird Grüner Pfeil
Ein neues Update für Thunderbird ist verfügbar.
Weiterlesen »

Montag, 1. Juli 2019

ORAL-B Elektrische Zahnbürste Langzeittest

Zwei Langzeittest mit einem Modell einer Elektrischen Zahnbürste von Oral-B und deren Defekten nach wenigen Jahren Gebrauch.

1. Defekt nach 3 Jahren: Akku der Elektrischen Zahnbürste defekt.
2. Defekt nach 4 Jahren: Elektrische Zahnbürste lässt sich nicht einschalten, schaltet sich von alleine ein und lässt sich nicht mehr ausschalten.
Fazit: Nach 2 Jahren nicht mehr zu gebrauchen. Garantie: 2 Jahre.

Oral-B PRO 3000 Elektrische Zahnbürste. UVP 139,99 Euro pro Stück.

ORAL-B Elektrische Zahnbürste Langzeittest

2x ORAL-B Professional Care 3000 / Oral-B PRO 3000 Elektrische Zahnbürste

Kaufdatum: 2012, Doppelpack (2 Stück), 99 Euro. € 139,99 UVP pro Stück.

Mit den zwei Elektrischen Zahnbürsten wurden zwei verschiedene Langzeittests durchgeführt.


1. Langzeittest

Der erste Langzeittest testete den Akku der Elektrischen Zahnbürste. Dabei wurde der Akku erst aufgeladen, nachdem er leer war. Dies funktionierte circa 1 Jahr. Nach einem Jahr war die Ladezeit länger als der Abstand zwischen dem Zähneputzen. Die Elektrische Zahnbürste musste also bevor der Akku vollständig aufgeladen war vom Ladegerät entfernt werden. Dieser Umstand verlängerte die Ladezeit kontinuierlich. Nach einigen Monaten lud der Akku gar nicht mehr vollständig auf, da der zwischenzeitliche Betrieb den Akku mehr entlud als er in der Zeit zwischen dem Zähneputzen auflud. Nach wenigen Wochen lies der Akku so stark nach, dass er irgendwann gar nicht mehr auflud und die Elektrische Zahnbürste sich nicht mehr einschalten lies. Nach ungefähr 3 Jahren war die erste Elektrische Zahnbürste wegen des Akkus defekt. Die Garantie-Zeit beträgt nur 2 Jahre. Zudem zeigten sich schon Anzeichen, die im 2. Langzeittest zum Defekt führten.

ORAL-B Elektrische Zahnbürste Langzeittest

Der Gummi am Handstück (Handgriff) wird klebrig und löst sich ab. Oral-B PRO 3000 Elektrische Zahnbürste.


2. Langzeittest

Der zweite Langzeittest testete insoweit die Lebensdauer der Elektrischen Zahnbürste im Allgemeinen mit stetigem Aufladen des Akkus. Das Ladegerät war ständig an den Strom angeschlossen und die Elektrische Zahnbürste stand stetig - außer zum Zähneputzen - auf der Ladestation. Nach circa 3 Jahren zeigten sich die selben Anzeichen, die beim 1. Test nicht zum Defekt führten, da der Akku dort vorher defekt war. Der Gummigriff - die Gummierung löste sich auf. Das war eine ziemlich ekelhafte Angelegenheit, da das Gummi klebrig wurde und allmählich abbröselte. Nachdem ein Großteil der Gummierung ab war, dauerte es einige Zeit bis es zum Defekt kam. Dabei zeigte sich eine Schwachstelle. Der Einschaltknopf ist von dieser Gummierung umgeben und direkt dahinter liegt ungeschützt die Elektronik der Elektrischen Zahnbürste. Es passierte folgendes in kurzer Zeit. Die Elektrische Zahnbürste lies sich nicht mehr einschalten. Dann schaltete sich die Elektrische Zahnbürste von alleine ein und lies sich nicht mehr ausschalten. Mitten am Tag fing die Elektrische Zahnbürste im Ladegerät stehend an zu vibrieren und hörte nicht mehr auf, bis der Akku leer war, und das dauerte sehr lange. Wenn die Elektrische Zahnbürste ohne Last frei vibriert, dann hält der Akku sie ziemlich lange am Vibrieren. Erst mit Last, also dem Aufdrücken auf die Zähne, oder dem Festhalten des Rotationsstabes, wird der Akku ziemlich schnell leer. Im zweiten Langzeittest war die Elektrische Zahnbürste nach gut 4 Jahren defekt.

ORAL-B Elektrische Zahnbürste Langzeittest
Oral-B PRO 3000 Elektrische Zahnbürste.
ORAL-B Elektrische Zahnbürste Langzeittest

Die Elektrische Zahnbürste schaltet sich von allein ein und lässt sich nicht mehr ausschalten, oder die Elektrische Zahnbürste schaltet sich nicht ein, wenn der Knopf gedrückt wird.

Von der Umweltverschmutzung durch das sich ablösende Gummi und dem eventuellen Verschlucken desselben einmal abgesehen, ist auch der Gummi selbst im Neuzustand ein Gesundheitsrisiko. Denn damit der Gummi sich in eine klebrige Masse verwandelt, die zerbröselt, werden stetig Chemikalien freigesetzt, die eingeatmet werden.

Für ein elektrisches Gerät mit einem Neupreis von 69 Euro (im Test ein Angebot mit 2 Stück für 99 Euro. UVP 139,99 Euro pro Stück) ist eine Lebensdauer von 3 bis 4 Jahren zu wenig. Ganz davon abgesehen von der Erzeugung von Elektronikschrott. Die Hersteller sind fein raus mit einer Garantieleistung von nur 2 Jahren, da die Geräte nur 2 Jahre funktionieren müssen.

Fazit: Beide Test zeigten, dass die Elektrische Zahnbürste bereits kurz nach dem Abblauf der Garantie nach 2 Jahren schon nicht mehr voll funktionstüchtig oder unansehnlich bis gesundheitsgefährdend sind.
Weiterlesen »

Sonntag, 11. November 2018

Shirtee-Shop für die eigene Webseite

Ein Tutorial mit dem ein Shirtee-Shop/Store in die eigene Webseite eingebunden werden kann.

08/2019: Der PHP Code ist veraltet. Bei Bedarf eines neuen PHP Codes bitte Kontakt aufnehmen.

Stand: 11/2018

Den folgenden PHP Code in eine Datei schreiben und diese per Kommandozeile aufrufen und dabei das Ergebnis in eine Datei schreiben. Beispiel:
[user@server ~]$ cd /path/to/the/phpcodefile/
[user@server phpcodefile]$ cd /path/to/the/phpcodefile/
[user@server phpcodefile]$ php phpcodefile.php >shirteeshop.txt
Danach das Ergebnis in der Datei in die eigene Webseite per include einbinden. Beispiel:
<?php
include __DIR__ . ("/shirteeshop.txt");
?>
Danach noch das zugehörige CSS in eine Datei schreiben und im Webseite <head> einbinden. Beispiel:
<link rel="stylesheet" type="text/css" href="shirteeshopstyle.css">

PHP Code:
1.) die URL vom Shop eintragen.
2.) die Anzahl der Shopseiten eintragen.
3.) eine Bild-Datei als "shirteebrokenimage.png" in das gleiche Verzeichnis wie die PHP Code Datei speichern.
4.) eventuell: den Namen vom Pfad für die Image-Dateien anpassen.
<?php
// YOUR SHIRTEE store URL
$shirteestoreurl = "https://www.shirtee.com/de/store/shopname/";
//
// THE LIMIT FOR STORE PAGES
$shirteestorelimitpages = "4";
//
// THE FOLDER-NAME FOR IMAGE SAVING ON YOUR WEBHOST
$shirteestoreimagesdir = "shirteeimages"; // relative path
//
// Extract the Store Name for the URL Query String
$shirteestoreurlexplode = explode("/", $shirteestoreurl);
$shirteestorename = $shirteestoreurlexplode[5];
//
$shirtee_mkdir = __DIR__ . "/" . $shirteestoreimagesdir;
if (file_exists($shirtee_mkdir)) {
$shirteestoreimagesscandir = scandir($shirtee_mkdir);
foreach (array_slice($shirteestoreimagesscandir, 2) as $unlinkshirteeimages) {
unlink($shirtee_mkdir . "/" . $unlinkshirteeimages);
}
}
//
if (!file_exists($shirteestoreimagesdir)) {
mkdir($shirteestoreimagesdir, 0755);
}
//
// The PAGES for while
$shirteestorenewarray = [];
for ($p = 1; $p <= $shirteestorelimitpages; $p++) {
//
$shirteestoreurllimitpages = $shirteestoreurl . "?p=" . $p;
//
$shirteestore = file_get_contents($shirteestoreurllimitpages);
//
if (((bool) $shirteestore === true)) {
$shirteestoreexplodeone = explode('<ul class="products-grid-campaigns products-grid products-grid--max-4-col">', $shirteestore);
$shirteestoreexplode = explode('</div></div></div></div></li></ul>', $shirteestoreexplodeone[1]);
$shirteestoreold = $shirteestoreexplode[0] . '</div></div></div></div></li>';
//
// match all img src="" in the original sourcecode
preg_match_all("/(src=(.*?) )/", $shirteestoreold, $shirteestoreimgsrcmatches, PREG_PATTERN_ORDER);
//
//
// the IMAGE for while
$shirteestoreimagesrcurlarray = [];
$shirteestorenewimagessourcepatharray = [];
for ($i = 0; $i < count($shirteestoreimgsrcmatches[2]); $i++ ) {
//
array_push($shirteestoreimagesrcurlarray, $shirteestoreimgsrcmatches[2][$i]);
//
$shirteestoreimagesrcurlpreview = urldecode(str_replace('"', '', $shirteestoreimgsrcmatches[2][$i]));
//
if (strpos($shirteestoreimgsrcmatches[2][$i], "shirtee.com/preview")) {
//
$file_get_contents_opts = array(
'http' => array(
'follow_location' => false,
'timeout' => 60,
)
);
$file_get_contents_context = stream_context_create($file_get_contents_opts);
//
if (false !== ($file_get_contents_content = @file_get_contents($shirteestoreimagesrcurlpreview, false, $file_get_contents_context))) {
//$shirteestoreimgurlpreviewcontent = $file_get_contents_content;
preg_match_all("/(content=\"0;url=(.*?)\")/", $file_get_contents_content, $shirteestoreimgsrcpreviewmatches, PREG_PATTERN_ORDER);
$shirteestoreimgsrcmatchesnew[2][$i] = $shirteestoreimgsrcpreviewmatches[2][0];
} elseif ((bool)$file_get_contents_content === false) {
// BROKEN image elseif
// extract img filename from preview-url
$shirteestoreimagesrcurlpreviewpur = urldecode(str_replace('"', '', str_replace('&s=i320', '', $shirteestoreimgsrcmatches[2][$i])));
$shirteestoreimagesrcurlpreviewpurexplode = explode("/", $shirteestoreimagesrcurlpreviewpur);
$shirteestoreimagespreviewfilenameend = end($shirteestoreimagesrcurlpreviewpurexplode);
//
// BROKEN img copy and rename to /shirteeimages
copy(__DIR__ . "/shirteebrokenimage.png", __DIR__ . "/" . $shirteestoreimagesdir . "/" . $shirteestoreimagespreviewfilenameend);
//
$shirteestoreimgsrcmatchesnew[2][$i] = $shirteestoreimagesrcurlpreviewpur;
}
}
else {
$shirteestoreimgsrcmatchesnew[2][$i] = $shirteestoreimgsrcmatches[2][$i];
}
//
// extract the img file name
$shirteestoreimagesrcurlexplode = explode("/", $shirteestoreimgsrcmatchesnew[2][$i]);
$shirteestoreimagesfilenameend = end($shirteestoreimagesrcurlexplode);
//
$shirteestoreimagesdirfilename = $shirteestoreimagesdir . "/" . $shirteestoreimagesfilenameend;
//
// create the img file
if (file_exists($shirteestoreimagesdirfilename) === false) {
if (!strpos($shirteestoreimgsrcmatchesnew[2][$i], "shirtee.com/preview")) {
$shirteestoreimagecreatefrompng = imagecreatefrompng($shirteestoreimgsrcmatchesnew[2][$i]);
imagealphablending($shirteestoreimagecreatefrompng, false);
imagesavealpha($shirteestoreimagecreatefrompng, true);
imagepng($shirteestoreimagecreatefrompng, $shirteestoreimagesdirfilename, 9, PNG_ALL_FILTERS);
}
}
//
// YOUR ABSOLUTE OR RELATIVE PATH TO THE SAVED IMAGES (for the source code <img src="...">)
$shirteestorenewimagessourcepath = '"' . "/" . $shirteestoreimagesdirfilename . '"';
array_push($shirteestorenewimagessourcepatharray, $shirteestorenewimagessourcepath);
//
}
$shirteestoreold = str_replace($shirteestoreimagesrcurlarray, $shirteestorenewimagessourcepatharray, $shirteestoreold);
//
// Extract the Shirtee Store Campaign URLs
preg_match_all("/(href=\"(.*?)\")/", $shirteestoreold, $shirteestorecampaignhrefmatches, PREG_PATTERN_ORDER);
//
// Put the URL Querystring at the campaign URLs START
$shirteestorecampaignhrefarray = [];
$shirteestorecampaignhrefnewarray = [];
$shirteestorecampaignhrefmatchesunique = array_unique($shirteestorecampaignhrefmatches[2]);
$shirteestorecampaignhrefmatchesuniquenew = array_values($shirteestorecampaignhrefmatchesunique);
//
for ($i = 0; $i < count($shirteestorecampaignhrefmatchesuniquenew); $i++ ) {
//
$shirteestorecampaignhref = $shirteestorecampaignhrefmatchesuniquenew[$i];
array_push($shirteestorecampaignhrefarray, $shirteestorecampaignhref);
//
if (strpos($shirteestorecampaignhref, "?")) {
$shirteestorecampaignhrefnew = $shirteestorecampaignhref . '&amp;shop=' . $shirteestorename;
} else {
$shirteestorecampaignhrefnew = $shirteestorecampaignhref . '?shop=' . $shirteestorename;
}
//
array_push($shirteestorecampaignhrefnewarray, $shirteestorecampaignhrefnew);
//
}
$shirteestoreold = str_replace($shirteestorecampaignhrefarray, $shirteestorecampaignhrefnewarray, $shirteestoreold);
//
//
$shirteestorenewline = preg_replace("/>\s</", ">\n<", $shirteestoreold);
$shirteestorelidiv = preg_replace("/<\/li><li/", "</div>\n\n<div", $shirteestorenewline);
$shirteestorelidiv = str_replace("<li", "\n\n<div", $shirteestorelidiv);
$shirteestorelidiv = str_replace("li>", "div>\n\n", $shirteestorelidiv);
$shirteestorenewarray[$p] = str_replace('href="', 'target="_blank" href="', $shirteestorelidiv);
//
}
//
}
//
echo '<div class="products-grid-campaigns products-grid products-grid--max-4-col">';
echo implode("", $shirteestorenewarray);
echo '</div>';
//
?>

Shirteeshop CSS:
/* Shirteeshop CSS BEGIN */
.shirteeshopdiv {
max-width: 970px;
margin: 0 auto;
text-align: center;
padding-bottom: 20px;
}
.shirteeshopheader {
font-size: 3em;
font-weight: bold;
margin-top: 20px;
margin-bottom: 20px;
}
.shirteeshopdescription {
font-size: 1.4em;
margin-bottom: 20px;
}
/* Shirteeshop Original CSS BEGIN */
.shirteeshopdiv .products-grid {
max-width: 970px;
margin: 0 auto;
padding: 0;
text-align: center;
}
.shirteeshopdiv .products-grid > li {
text-align: center;
}
.shirteeshopdiv .products-grid .item {
width: 23%;
margin: 0.5%;
display: inline-block;
}
.shirteeshopdiv .products-grid-campaigns .item {
margin-bottom: 12px;
background: #fff;
border-radius: 1px;
border: 1px solid #ccc;
-webkit-transition: transform .2s linear 0s;
-moz-transition: transform .2s linear 0s;
-o-transition: transform .2s linear 0s;
transition: transform .2s linear 0s;
z-index: 1;
vertical-align: top;
}
.shirteeshopdiv .products-grid-campaigns .product-image .product-image-zoom {
-webkit-transition: all .2s linear 0s;
-moz-transition: all .2s linear 0s;
-o-transition: all .2s linear 0s;
transition: all .2s linear 0s;
}
.shirteeshopdiv .products-grid .product-image img {
width: 100%;
height: auto;
}
.shirteeshopdiv .products-grid .product-image {
position: relative;
padding: 0;
margin: 10px;
display: block;
overflow: hidden;
width: calc(100% - 20px);
}
.shirteeshopdiv .products-grid .product-info {
position: relative;
padding-bottom: 95px;
}
.shirteeshopdiv .products-grid .product-info {
padding: 10px 18px 10px;
padding: 10px 18px 10px;
padding-bottom: 10px;
background: #f0f0f0;
border-top: 1px solid #b5b5b5;
}
.shirteeshopdiv .products-grid .product-name, .products-list .product-name {
text-transform: uppercase;
margin-bottom: 5px;
font-size: 14px;
font-family: "Raleway","Helvetica Neue",Verdana,Arial,sans-serif;
}
.shirteeshopdiv .products-grid .product-name {
font-weight: normal;
color: #000;
margin: 0 0 7px;
line-height: 1.4em;
}
.shirteeshopdiv .products-grid .product-name a {
display: block;
font-family: 'Open Sans',sans-serif;
text-transform: initial;
text-overflow: ellipsis;
text-decoration: none;
font-weight: 600;
color: #333c4e;
}
.shirteeshopdiv .products-grid .price-box-text {
display: none;
}
.shirteeshopdiv .products-grid .price-box {
margin: 7px 0;
font-family: "Helvetica Neue",Verdana,Arial,sans-serif;
}
.shirteeshopdiv .products-grid .price-box .price {
font-weight: 700;
font-family: 'Open Sans',sans-serif;
font-size: 16px;
color: #333c4e;
line-height: 22px;
}
.shirteeshopdiv .products-grid .item:hover {
-webkit-box-shadow: 0 2px 30px 0 rgba(0,0,0,.2);
box-shadow: 0 2px 30px 0 rgba(0,0,0,.2);
}
.shirteeshopdiv .products-grid .item:hover .product-image-zoom {
-webkit-transform: scale(1.4);
-moz-transform: scale(1.4);
-ms-transform: scale(1.4);
-o-transform: scale(1.4);
transform: scale(1.4);
}
.shirteeshopdiv .products-grid .item:hover .product-name {
height: auto;
white-space: normal;
}
.shirteeshopdiv .products-grid h2.product-name a:hover, h3.product-name a:hover, h4.product-name a:hover, h5.product-name a:hover, p.product-name a:hover {
color: #39c;
text-decoration: none;
}
/* Shirteeshop Original CSS END */

Keine Garantie. Keine Gewährleistung. Kein Support.
Verwendung auf eigenes Risiko.

Weiterlesen »

PHP Warning file_get_contents() best solution

PHP Warning:  file_get_contents(https://example.com/): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/virtual/blabla/test.php on line 123

There are many solutions to the problem posted on the Internet. Not all of these solutions really solve the problem. The challenge with this problem is the use of boolean (false / true).
$file_get_contents_url = "";
if (false !== ($content = @file_get_contents($file_get_contents_url))) {
// use here the filled variable $content for your code.
} elseif ($check === false) {
// here your code for "false".
} else {
// here your possible "fallback" code.
}
No guarantee. No warranty. No support.
Use at your own risk.
Weiterlesen »

Samstag, 1. September 2018

Wetterbericht mit Wunschwetter

Allgemein bekannt ist, dass Wetterberichte das Wetter maximal für 3 Tage vorhersagen können. Bei unbeständigem Wetter weniger als 3 Tage und manchmal auch nur weniger als 1 Tag. Doch was Wetterberichte zusätzlich machen ist, dass sie nicht das wahrscheinlichste Wetter vorhersagen, sondern das wahrscheinlich angenehmste Wetter. Die Wetterberichte vorhersagen nicht das wahrscheinlichste Wetter, sondern ein Wunschwetter, das kurz vor knapp auf das wahrscheinlichste Wetter korrigiert wird.

Wetterbericht mit Wunschwetter
Bilder: The people from the Tango! project. gemeinfrei.

Seitdem es mehrere Wetterberichte mit Wettervorhersagen gibt, gibt es auch Unterschiede in den Wettervorhersagen. Diese unterscheiden sich nicht nur in den Langzeitvorhersagen zwischen 4 und 16 Tagen, sondern auch in den Vorhersagen bis zu 3 Tage. In den Kurzzeitvorhersagen bis maximal 24 Stunden sind sie alle ziemlich gleich.

Die Wetterberichte haben das Problem etwas sehr unvorhersebares vorherzusagen, eben das Wetter. OK, dass es im Sommer warm und im Winter kalt ist, ist damit nicht gemeint. Die Wetterberichte sind heutzutage in der Lage das Wetter für maximal 3 Tage vorherzusagen und geben zudem Prognosen für die nächsten 16 Tage. Jeder Wetterbericht verwendet für seine Vorhersage andere Parameter, die zu unterschiedlichen Ergebnissen führen. Die Parameter, die zu den Unterschieden führen, sind nicht wettertechnische. Denn wenn alle nach dem neuesten wettertechnisch-wissenschaftlichen Stand vorhersagen würden, wären alle Wettervorhersagen gleich.

Wetterbericht mit Wunschwetter
Bild: The Norwegian Meteorological Institute. met.no.

Mit zunehmendem zeitlichen Abstand in die Zukunft wird die Toleranz des möglichen Wetters immer größer. Das ergibt einen Spielraum, der von den Wetterberichten für ihre Wettervorhersagen genutzt wird. Die Wetterberichte verwenden zusätzliche Parameter, die nichts mit der wissenschaftlichen Wettervorhersage zu tun haben - die Wetterlaune der Menschen. Ein Wetterbericht, der eher angenehmes Wetter vorhersagt ist beliebter als einer, der eher unangenehmes Wetter vorhersagt - so tickt der Mensch. Ausnahmen, wie Pessimisten, die sich in Vorhersagen mit unangenehmen Wetter, dass dann auch eintrifft, bestätigt fühlen, sowie Optimisten, die sich in Vorhersagen mit angenehmen Wetter, dass dann auch eintrifft, bestätigt fühlen, aussen vor gelassen.

Insbesondere in den Langzeitvorhersagen, aber mittlerweile auch bei unbeständigem Wetter in den 3-Tages-Vorhersagen, wird der Parameter "angenehm" verwendet. Ein zunehmend unbeständiges Wetter gelangt den Wetterberichten also zum Vorteil. Mit abnehmendem Zeitabstand wird der Parameter "angenehm" bis auf Null verkleinert. Das Verwenden des Parameters "angenehm" reduziert die Wettervorhersagen auf 24-Stunden-Vorhersagen. Bei den 3-Tages-Vorhersagen und insbesondere bei den Langzeit-Vorhersagen wird von den Wetterberichten nicht der Mittelwert der Wetter-Toleranz, und schon gar nicht die Wetter-Toleranz an sich, sondern wenn dann immer eine Wetter-Tendenz mit Toleranz oder eben ein tendenziell angenehmes Wetter vorhergesagt.

Was ein angenehmes Wetter ist, darin unterscheiden sich die Leute. Von daher haben Wetterberichte, die ein tendenziell angenehmes Wetter vorhersagen, ein Klientel, das sich durch die unterschiedlichen Wettervorhersagen unterscheidet. Die Leute in Gruppen zu unterscheiden hat zudem den Vorteil der personalisierten Werbung. Die Leute, für die ein kühles Wetter angenehm ist, sind ein Klientel für andere Produkte und Dienstleistungen als Leute, für die ein warmes Wetter angenehm ist.

Der Markt regelt das Wetter?
Der Markt regelt die Wettervorhersagen!
Weiterlesen »

HaveIBeenPwned Password Cracker

Die Website HaveIBeenPwned bietet für jeden eine Möglichkeit per Emailadresse zu checken, ob diese zusammen mit dem dazugehörigen Passwort (unverschlüsselt/ungehasht) in eine der im Internet "geleakten" Listen enthalten ist. Diese Listen wurden durch Hacker von Webseiten gedownloadet, deren Server und Software Sicherheitslücken hatten. Darunter Myspace (360 Millionen, 2009), LinkedIn (164 Millionen, 2012), Tumblr (65 Millionen, 2013), Fling.com (40 Millionen) und VK (171 Millionen, 2016). Insgesamt hat HaveIBeenPwned 517 Millionen Datensätze (Emailadresse + Passwort) vorrätig.

Die Datensätze enthalten also neben einer Zuordnung von Emailadresse-Passwort, mittels der ein Account, der diese beiden zusammenhängend verwendet, geknackt werden kann, auch eine riesige Emailadressen-Liste, mittels der Spam versendet werden kann, und auch eine riesige Passwort-Liste, mittels der Passwörter geknackt werden können.

Das Problem mit Passwortlisten: Riesige Passwortlisten sind ziemlich unnütz um einen Account auf herkömmliche Weise zu knacken, da die Software die Anzahl der Versuche eingrenzt einen Account zu knacken. Wenn dann muss sich Zugang zu Userdatenbanken verschafft werden und es muss die Verschlüsselungsmethode der Passwörter bekannt sein, die meist durch eine Generierung der Passwörter als Hashes realisiert wird. Dann werden die geleakten ungehashten Passwörter mittels der Hashmethode gehasht und mit den Hashwerten der Passwörter in der Userdatenbank verglichen. Bei einem Treffer wird dann das zugehörige ungehashte Passwort dem geleakten Datensatz mit Emailadresse zugeordnet und die Accounts geknackt.

Das Problem der Emailadressenlisten: Riesige Listen an Emailadressen sind für das Versenden von Spam ziemlich unnütz, da sie viele ungenutzte Emailadressen enthalten, deren Emails niemand mehr liest. Zudem erzeugen ungültige Emailadressen zusätzlichen Traffic via Mailer-Daemon und dergleichen. Die riesigen geleakten Emailadressenlisten müssen also gefiltert werden. Dies ist am besten zu realisieren, wenn dies die User selbst tun, via einer Webseite wie HaveIBeenPwned. Somit entstehen hochwertige Emailadresslisten für Spam, die im Darknet Höchstpreise erzielen ("filtered").

Im Sommer 2018 entschied sich Github für eine Partnerschaft (Partnership) mit HaveIBeenPwned um die Passwörter seiner User zu knacken, die in den geleakten Listen, die HaveIBeenPwned vorrätig hat, vorhanden sind. Die Userdatenbank von Github selbst wurde nach Angaben von Github nicht gehackt und geleakt. Github verspricht zwar wie jede andere Plattform, dass sie selbst die Passwörter der User nicht unverschlüsselt/ungehasht einsehen können, doch umgeht das mittels der Partnerschaft mit HaveIBeenPwned. Github hat es sich zur Aufgabe gemacht, seine User darüber zu informieren, ob ihre Passwörter in eine der Passwortlisten von HaveIBeenPwned vorhanden ist. Dabei werden nur die Passwörter geprüft, nicht der Zusammenhang Emailadresse-Passwort. Damit entschlüsselt/enthasht Github die Passwörter seiner User, wenn diese in einer der HaveIBeenPwned-Passwortlisten vorhanden sind, auch wenn der User nie einen Account bei einer der Plattformen der geleakten Listen hatte. Freundlicherweise informiert Github die User darüber, wenn dem so ist, und legitimiert sich das als Dienst im Namen der Sicherheit. Die Idee dahinter: Die User sollen keine Passwörter verwenden, die in einer der geleakten Listen sind. Das sind viele Millionen Passwörter, die nicht mehr verwendet werden sollen.

Das Github-Problem: Github enthasht die Passwörter seiner User nicht im Zusammenhang mit den Emailadressen, wie sie in den geleakten Listen vorhanden sind. Das kommt einem Knacken der Passwörter eines Hackers gleich. Github kann somit nicht mehr behaupten, dass sie die Passwörter der User nur gehasht einsehen können, da Github via HaveIBeenPwned die Passwörter seiner User knackt.

Zurzeit informiert Github seine User nur, wenn das Passwort des Users von Github-HaveIBeenPwned geknackt wurde. Möglich ist, dass diese Accounts in naher Zukunft gesperrt werden, wenn der User sein Passwort nicht ändert.

HaveIBeenPwned Github Password Cracker

Was Github will: Github will, dass seine User keine der Passwörter aus den geleakten Listen verwenden. Dazu muss Github die Passwörter seiner bereits registrierten User knacken. Zudem werden keine neuen Accounts mit einem Passwort, dass in den geleakten Listen vorhanden ist, registriert.

HaveIBeenPwned Github Password Cracker

Weiterlesen »

Dienstag, 3. Juli 2018

Affiliate Direktwerbung & DSGVO (personalisierte Werbung)


Die Umsetzung der DSGVO im Affiliatemarketing läuft völlig in die falsche Richtung. Affiliates (Publisher) werden von den Affiliatenetzwerkbetreibern zwar nicht zu Allein-Verantwortlichen, aber doch zu Mit-Verantwortlichen gemacht und den Affiliates (Publishern) werden dadurch von den Affiliatenetzwerkbetreibern Pflichten aufgedrückt. So ist die DSGVO nicht zu verstehen, bzw. wird völlig falsch verstanden.

Das Ganze läuft völlig aus dem Ruder, wenn es zu Ende gedacht wird. Affiliatenetzwerkbetreiber können Affiliates (Publishern) jetzt drohen, wenn sie den aufdoktrinierten Pflichten nicht nachkommen. Dabei ist es für die Affiliates (Publisher) unmöglich diese Pflichten, die eigentlich die Affiliatenetzwerkbetreiber erfüllen müssen, zu erfüllen. Affiliates (Publisher) werden verantwortlich gemacht für die Realisierung des Rechts auf Widerspruch bei Direktwerbung (direct marketing) und der Hinweispflicht auf dieses Widerspruchrechts bei Direktwerbung. Wovon die wenigsten Affiliates (Publisher) wissen, die Direktwerbung auf ihren Webeseiten einblenden.
Art. 21 DSGVO Widerspruchsrecht

(2) Werden personenbezogene Daten verarbeitet, um Direktwerbung zu betreiben, so hat die betroffene Person das Recht, jederzeit Widerspruch gegen die Verarbeitung sie betreffender personenbezogener Daten zum Zwecke derartiger Werbung einzulegen;

(4) Die betroffene Person muss spätestens zum Zeitpunkt der ersten Kommunikation mit ihr ausdrücklich auf das in den Absätzen 1 und 2 genannte Recht hingewiesen werden; dieser Hinweis hat in einer verständlichen und von anderen Informationen getrennten Form zu erfolgen.
Quelle: https://dsgvo-gesetz.de/art-21-dsgvo/

Bei Adsense Direktwerbung müssen alle Beteiligten in der Datenschutzerklärung gelistet werden, was bei Adsense Direktwerbung (personalisierte Anzeigen) an die 700 Firmen sind, die mit Anschrift und Ansprechpartner erwähnt werden müssen. Der Affiliate (Publisher) weiß nicht, welche der 700 gerade aktiv Werbung auf seinen Webseiten liefert, er kann die 700 nur in der Anzahl begrenzen, was eine Beschränkung darstellt. Auch die von Adsense angebotene Abschaltung von Personalisierten Anzeigen ist nur eine Einschränkung, die auf einen Denkfehler bezüglich der DSGVO beruht.

Nicht nur technisch, sondern auch logisch sind die Forderungen der DSGVO so nicht realisierbar, indem Affiliates (Publisher) zu Mit-Verantwortlichen gemacht werden. Einzig Verantwortlicher ist und bleibt der Affiliatenetzwerkbetreiber.

In bisherigen Lösungen werden unter anderem für ein Widerspruchsrecht Cookies eingesetzt, auch Drittanbieter-Cookies (Adcell). Wenn ein Viewer in seinem Browser Cookies und/oder Drittanbieter-Cookies nicht akzeptiert, was sein Recht ist, wird der Widerspruch nicht realisiert und der Affiliate (Publisher) soll nun dafür verantwortlich sein.

Die Affiliatenetzwerkbetreiber drücken den Affiliates (Publisher) eine "Vereinbarung zur Auftragsdatenvereinbarung" oder "Datenverarbeitungsvereinbarung" auf um die Verantwortung auf die Affiliates (Publisher) abzuwälzen (Adcell, Awin, Affili.net). Die Affiliates (Publisher) wiederum können die Pflichten gar nicht erfüllen.

Ein Widerspruch per Drittanbieter-Cookie ist nicht rechtssicher, weil diese blockiert werden können und sogar jeder Viewer ein Recht darauf hat diese zu blockieren. Hier müsste ein Recht entfernt werden, damit ein anderes realisiert werden kann, was völliger Nonsens ist. Wenn ein Affiliate (Publisher) ein Widerspruch Opt-Out per Cookie selbst programmiert, dann gilt dieses nur für seine Website und ist so kein wirklicher Widerspruch gegen Direktwerbung eines Affiliatenetzwerkbetreibers, der die personenbezogenen Daten erhebt, verarbeitet und speichert, sondern nur einer für eine Domain. Das ist so kein Widerspruch, wie er von der DSGVO verlangt wird.

Die einzig richtige Umsetzung der DSGVO ist, wenn Affiliates (Publisher) nur Vermieter von Werbefläche sind, was sie rechtlich schon immer waren, und nie mehr. Sie sind keine Mit-Verantwortlichen laut DSGVO. Sie werden nur dazu gedrängt. Ein Vermieter von Werbefläche ist nur für die Inhalte der Werbung verantwortlich, mehr nicht (also zB kein Porno).

Die einzig richtige Umsetzung der DSGVO ist, wenn »in« und »mit« der Werbung die Pflichten laut DSGVO erfüllt werden. In und mit der Werbung muss sowohl der Hinweis auf das Recht auf Widerspruch erfolgen und der Widerspruch mittels Opt-Out stattfinden können (Mit vorheriger Prüfung ob Cookies akzeptiert werden. Werden keine Cookies akzeptiert, dann keine Direktwerbung.). Nur so ist es erstens technisch rechtssicher realisierbar und zweitens logisch. Aber davor scheinen sich die Affiliatenetzwerkbetreiber zu sträuben, warum auch immer.

Die Affiliates (Publisher) müssen Widerstand zeigen, indem sie sich nicht die Pflichten der DSGVO, die von den Affiliatenetzwerkbetreibern erfüllt werden müssen, aufdrängen lassen. Hiervon ist aber leider nichts zu merken. Viel eher macht die Runde, dass alle Affiliates (Publisher) kuschen.

Ein Affiliate (Publisher) ist kein Verantwortlicher im Sinne der DSGVO. Ein Affiliate (Publisher) vermietet nur Werbefläche gegen Provision. Ein Affiliate (Publisher) hat rein gar nichts mit den Daten zu tun, die über die vermietete Werbefläche erhoben, gespeichert und verarbeitet werden. Alle Affiliates (Publisher) sind Vermieter. Affiliates (Publisher) betrifft die DSGVO, was Affiliate betrifft, rein gar nicht.

Ein Beispiel: Ein Werbeflächenvermieter im Straßenraum hat keinerlei Verantwortung darüber, dass die angezeigte Werbung das Heilmittelwerbegesetz ("Zu Risiken und Nebenwirkungen...") erfüllt. Das wäre auch völlig irre, wenn dem so wäre. Aber die Affiliates (Publisher) als Werbeflächenvermieter sollen dafür verantwortlich sein? Alles was da zurechtgesponnen wird, damit die Affiliates (Publisher) auch Verantworliche sind, sind alles Denkfehler.


Adsense OptOut Funktion:

Solange die Affiliate Netzwerk Betreiber die Pflicht zum Hinweis und Realisierung des Rechts auf Widerspruch an die Publisher weiterreichen, hilft nur, dass sich jeder Publisher selbst schützt und zumindest auf seinen Webseiten die Direktwerbung DSGVO-konform macht.

Solange die Situation uneindeutig ist, können die Adsense Code-Snippets mit JavaScript um wichtige DSGVO-bezügliche Funktionen erweitert werden. Auf der folgenden verlinkten Webseite werden 3 Möglichkeiten zur Realisierung der aufgedrückten DSGVO Pflichten angeboten:
https://www.penultima.de/opt/adsense.php




Ausschluss-Klausel: Dies ist keine Rechtsberatung. Dies ist nur eine laienhafte Mindermeinung über die Sachlage. Die hier zu empfangenden Informationen werden unter Ausschluss jeglicher Garantie und Gewährleistung angeboten. Es wird keine, bzw. es kann keine Verantwortung für die dargestellten Informationen übernommen werden. Keine Gewähr für Richtigkeit, Vollständigkeit und Aktualität.
Weiterlesen »