Warum nicht einen Primärschlüssel verfügbar machen?


53

In meiner Ausbildung wurde mir gesagt, dass es eine fehlerhafte Idee ist, dem Benutzer tatsächliche Primärschlüssel (nicht nur DB-Schlüssel, sondern alle primären Zugriffsmethoden) zur Verfügung zu stellen.

Ich dachte immer, es sei ein Sicherheitsproblem (weil ein Angreifer versuchen könnte, Dinge zu lesen, die nicht von ihm stammen).

Jetzt muss ich überprüfen, ob der Benutzer trotzdem Zugriff hat. Gibt es also einen anderen Grund dafür?

Da meine Benutzer ohnehin auf die Daten zugreifen müssen, muss ich irgendwo dazwischen einen öffentlichen Schlüssel für die Außenwelt haben. Nun, dieser öffentliche Schlüssel hat die gleichen Probleme wie der Primärschlüssel, nicht wahr?


Es gab die Anfrage eines Beispiels, warum das sowieso so ist, also hier ist eines. Denken Sie daran, dass es sich bei der Frage nicht nur um das Prinzip selbst handelt, wenn es in diesem Beispiel zutrifft. Antworten auf andere Situationen sind ausdrücklich erwünscht.

Eine Anwendung (Web, Mobile), die Aktivitäten abwickelt, verfügt über mehrere Benutzeroberflächen und mindestens eine automatisierte API für die systemübergreifende Kommunikation (z. B. möchte die Buchhaltungsabteilung wissen, wie viel dem Kunden basierend auf den durchgeführten Aktionen berechnet wird). Die Anwendung hat mehrere Kunden, sodass die Trennung ihrer Daten (logischerweise werden die Daten in derselben Datenbank gespeichert) ein Muss des Systems ist. Jede Anfrage wird auf ihre Gültigkeit hin überprüft.

Die Aktivität ist sehr feinkörnig, so dass sie in einem Containerobjekt zusammengefasst ist. Nennen wir sie "Task".

Drei Anwendungsfälle:

  1. Benutzer A möchte Benutzer B an eine Aufgabe senden, damit er ihm einen Link (HTTP) sendet, um dort eine Aktivität auszuführen.
  2. Benutzer B muss das Gebäude verlassen, damit er die Aufgabe auf seinem Mobilgerät öffnet.
  3. Das Rechnungswesen möchte dem Kunden die Aufgabe in Rechnung stellen, verwendet jedoch ein Buchhaltungssystem eines Drittanbieters, das die Aufgabe / Aktivität automatisch mit einem Code lädt, der auf die REST-API der Anwendung verweist

Für jeden Anwendungsfall muss (oder wird es einfacher, wenn) der Agent eine adressierbare ID für die Aufgabe und die Aktivität hat.


3
verwandt: Sollte ein Ersatzschlüssel jemals einem Benutzer zugänglich gemacht werden? "Sie müssen bereit sein für alle Identifikatoren, die Benutzern / Kunden zur Verfügung stehen, die geändert werden müssen. Wenn Sie die Identität einer Zeile in einer Datenbank ändern und diese Änderung auf alle Fremdschlüssel übertragen, müssen Sie nur Daten brechen ..."
gnat

Dafür ON UPDATE CASCADEwurde @gnat erstellt (mysql-spezifisch?). Wenn das Problem jedoch die Sicherheit ist, sollte die Zugriffskontrolle im Backend erfolgen und dem Benutzer sowieso nicht vertrauen
Izkata,

2
@Izkata Ja, es sei denn, Sie referenzieren sie in einem anderen Datenspeicher (Benutzer-ID in LDAP als einfaches Beispiel) oder Sie müssen einige Daten aus einer Sicherung wiederherstellen. Mücke hat da einen guten Punkt.
Angelo Fuchs

Können Sie bitte erläutern, was Sie mit "aussetzen" meinen? Ein aktuelles Beispiel könnte helfen. :-)
CodeCaster

"aussetzen" bedeutet, es dem Benutzer zu zeigen. (Mit Benutzer meine ich meistens einen Menschen, aber die Frage scheint auch für Maschinen gültig zu sein)
Angelo Fuchs

Antworten:


38

Da meine Benutzer ohnehin auf die Daten zugreifen müssen, muss ich irgendwo dazwischen einen öffentlichen Schlüssel für die Außenwelt haben.

Genau. Nehmen Sie das zustandslose HTTP, das sonst nicht wissen würde, welche Ressource es anfordern soll: Es macht die ID Ihrer Frage 218306in der URL sichtbar. Vielleicht fragen Sie sich tatsächlich, ob eine exponierte Kennung vorhersehbar sein kann ?

Die einzigen Stellen, an denen ich eine negative Antwort darauf gehört habe, benutzten die Begründung: "Aber sie können die ID in der URL ändern!" . Sie verwendeten also GUIDs, anstatt die richtige Autorisierung zu implementieren.

Ich kann mir eine Situation vorstellen, in der Ihre Identifikatoren nicht vorhersehbar sein sollen: Ressourcenernte. Wenn Sie eine Website, die öffentlich bestimmte Ressourcen andere Hosts kann interessant sein , in und hosten Sie sie mögen /images/n.jpgoder /videos/n.mp4wo nist nur eine fortlaufende Nummer, jeder an Verkehr zu und von Ihrer Website suchen , können Sie alle Ihre Ressourcen ernten.

Um Ihre Frage direkt zu beantworten: Nein, es ist nicht schlecht, Bezeichner, die nur eine Bedeutung für Ihr Programm haben, direkt "offenzulegen". In der Regel ist es sogar erforderlich, dass Ihr Programm erfolgreich ausgeführt wird.


2
Nicht erratbare URLs (z. B. mit einem kryptografisch zufälligen 128-Bit-Token) sind eine Form der ordnungsgemäßen Autorisierung.
CodesInChaos

Richtig wie bei extrem empfindlichen Wiederholungsangriffen? Es ist nützlich für eine einmalige Verwendung wie eine URL zum Zurücksetzen des Kennworts, jedoch weniger, um eine statische Ressource zu identifizieren, da jeder sie verwenden kann, ohne dass Sie sie ändern können, ohne dass ein legitimer Verweis darauf verletzt wird es.
CodeCaster

Hm? Natürlich ist SSL erforderlich, aber dies ist unabhängig davon, wie Sie sich authentifizieren und autorisieren. Über SSL kann ein Angreifer das Token nicht lernen (so wie er Cookies nicht lernen kann) und es werden auch Wiederholungsangriffe verhindert. Der Hauptnachteil dieses Ansatzes ist, dass Sie den Zugriff für einzelne Benutzer nicht widerrufen können. Ich bevorzuge es, ihn nur für unveränderliche Ressourcen zu verwenden. Das Sperren des Zugriffs auf unveränderliche Ressourcen ist bedeutungslos, da ein Angreifer einfach eine lokale Kopie speichern kann.
CodesInChaos

2
Ich scheine heutzutage nicht in der Lage zu sein, auszudrücken, was ich meine, es tut mir leid. Ich meine, die Verwendung eines zufälligen Tokens für eine statische Ressource im Gegensatz zu einer inkrementellen ID ist in Ordnung, wenn Sie möchten, dass die Ressource öffentlich zugänglich ist, aber nicht erraten werden kann. Für jede andere Verwendung würde ich jedoch aufgrund der Widerrufssache eine einmalige Verwendung vorziehen.
CodeCaster

1
Keiner, mein Punkt genau. Können Sie vielleicht erläutern, was Sie dann mit "aussetzen" meinen?
CodeCaster

29

Sie sollten es nicht offenlegen, da Personen, die es sehen, es als ihre "Kontonummer" verwenden, was NICHT der Fall ist. Beispielsweise weiß ich für mein Bankkonto, wie meine Kontonummer lautet. Ich habe es auswendig gelernt, ich benutze es am Telefon beim Kundendienst, ich benutze es beim Ausfüllen von Formularen für andere Banken, um Überweisungen zu tätigen, für juristische Dokumente, für meinen automatischen Zahlungsdienst usw. Ich möchte nicht es zu ändern. Den Primärschlüssel (für meinen Account) dagegen kenne ich nicht oder sehe ihn nie.
Das System, in dem es gespeichert wird, ändert sich im Laufe der Jahre von einem System zum anderen, durch Zusammenführung von Banken, System-Upgrades und -Ersetzungen usw. usw.
Die Primärschlüssel können sich durch einige dieser Transformationen ändern von jedem normalen Benutzer, der
Schlüssel ohne geschäftliche Bedeutung werden häufig als Ersatzschlüssel bezeichnet und werden häufig (aber nicht immer) als Primärschlüssel verwendet.

Übrigens geschieht dies sogar intern, wenn Benutzer Schnittstellen und Programme erstellen, die Primärschlüssel missbrauchen und verfügbar machen und sie zu einem Teil solcher Systeme machen, anstatt nur eine einzige Aufgabe zu übernehmen - die eindeutige interne Identifizierung eines Datenbankdatensatzes. Ich habe dies tatsächlich durch eine 6-jährige Tätigkeit als Support für ein Data-Warehouse-System in einem Krankenhaus gelernt.


4
+1, aber was Sie hier beschreiben, ist eigentlich ein Ersatzschlüssel . Nicht jede Tabelle verfügt über einen Ersatzschlüssel, und selbst wenn dies der Fall ist, ist der Ersatz möglicherweise nicht der "Primärschlüssel".
nvogel

2
+1 Ich dachte, die Kontonummer wäre der Ersatzschlüssel, aber ich habe es nachgelesen und Sie sind 100% korrekt :)
Michael Durrant

2
+1 es für Benutzer verfügbar zu machen, fügt implizite Anforderungen hinzu (z. B. statisch bleiben)
Matt

1
Gute Antwort. Meine Kurzform ist, dass Ersatzschlüssel nützlich sind, weil sich niemand um sie kümmert und es daher niemanden interessiert, ob Sie sie ändern oder nicht. Wenn Sie sie aussetzen, werden die Leute beginnen, sich um sie zu kümmern.
JimmyJames

tl; dr: weil die zukunft. Wenn sich etwas Externes auf einen Schlüssel stützt, wird es unübersichtlich, wenn sich die Implementierung später ändert. Halten Sie sie also mehr oder weniger verborgen, um die Dinge einfacher zu machen.
Adam Tolley

27

Weil Primärschlüssel ein Implementierungsdetail sind.

Wenn Sie Datenbanken migrieren, können sich Ihre Primärschlüssel aufgrund der Reihenfolge des Einfügens und Entfernens alter Datensätze ändern. Dies kann verschiedene Gründe haben. Wenn Sie Datenbank migrieren Plattformen können Sie nicht mehr über einen tatsächlichen gar Primärschlüssel. Das Freilegen der PK über der Datenzugriffsschicht ist eine undichte Abstraktion mit allen damit verbundenen Kopplungsproblemen.


3
Wie identifiziert eine Anwendungsschicht eine Ressource, die sie ohne einen Primärschlüssel abrufen oder in der Datenschicht aktualisieren möchte, eindeutig?
CodeCaster

2
@CodeCaster - entweder durch einen eindeutigen indizierten Datensatz oder durch einen nicht öffentlichen Primärschlüssel, der als Teil des von der Datenzugriffsebene bereitgestellten Objekts zurückgegeben wird.
Telastyn

1
@CodeCaster - Es gibt viele Möglichkeiten, ein Token zu erstellen, mit dem der Rückruf angeben kann, welche Operation ausgeführt wird, und mit Sicherheit geben nicht alle nur den Primärschlüssel durch.
Telastyn

2
Dazu muss die Datenschicht jedoch wissen, welches Token zu welcher PK gehört (oder in diese übersetzt wird). Das klingt für mich nach einer zusätzlichen Schicht unnötiger Komplexität, nur um die PK zu verstecken. Welchem ​​Zweck dient das, abgesehen davon, den Architekten zufrieden zu stellen? Ich stimme Ihrem Punkt zu, finde ihn jedoch nicht in der Praxis anwendbar und würde ein aktuelles Beispiel begrüßen.
CodeCaster

1
@CodeCaster - Nein, die mittlere Schicht erledigt tatsächlich ihre Aufgabe und gibt an, dass über die Benutzeroberfläche überhaupt Datenzugriff besteht. Es gibt viele schlechte Architekten auf der Welt, aber viele der besten Praktiken der Programmgestaltung existieren aus einem bestimmten Grund. Einige Apps können das Risiko dieser undichten Abstraktion eingehen, andere nicht.
Telastyn

10

Dies ist eine kombinierte Antwort der anderen (aka. Was ich gelernt habe). Wenn Sie Lust haben, diesen zu verbessern, sollten Sie zumindest einen der anderen positiv bewerten, der die eigentliche Arbeit geleistet hat. Wenn Sie mehr interessiert sind, lesen Sie stattdessen die anderen Antworten.

Sie sollten den Primärschlüssel der Datenbank nicht offen legen, sondern einen Ersatzschlüssel verwenden

  1. Wenn Sie möchten, dass sich Ihre Benutzer (zumindest ein wenig) erinnern oder die Kennung eines Eintrags erkennen können. ( Graystone28s Antwort )
  2. Wenn Sie vorausplanen möchten und in Betracht ziehen, dass Sie möglicherweise Systeme ändern (Datenbank oder auf andere Weise), wird dies wahrscheinlich Ihre PK ändern. ( Telastyns Antwort )
  3. Wenn Sie sicherstellen möchten, dass Ihre Benutzer auf konsistente Weise auf Daten zugreifen können, die sich auch dann nicht ändern, wenn Ihr Unternehmen den Eigentümer wechselt und die Daten in ein anderes System migriert werden. ( Michael Durrants Antwort )
  4. Wenn Ihre PK vorhersehbar ist (wie eine Sequenz), kann es auf Ihrem System zu Problemen bei der Ressourcenernte kommen. ( Antwort von CodeCasters ) Dies gilt nur, wenn Ihr System Informationen enthält, die es wert sind, gesammelt zu werden, und die für jeden oder zumindest für jemanden zugänglich sind, der ein Interesse am Sammeln hat.

Hinweis: Ihr erstellter Schlüssel sollte (irgendwie) für den Menschen verständlich sein ( Sqlvogels Answer ).

Wenn Ihr System keine 1. bis 4. benötigt, gibt es keinen Grund, die Datenbank-PK nicht als öffentliche Kennung zu verwenden (mehrere der Antworten). Auch die Sicherheit spielt hier keine Rolle (einige der Antworten).


8

Ein Grund, warum ich festgestellt habe, war, dass Endbenutzer in der Fülle der Zeit nachfragen, ob ihre Kennung etwas bedeutet (z. B. ein Präfix oder einen Indikator für das Jahr, in dem sie begonnen hat). Das Ändern einer PK ist schwierig, aber ein Ersatz ist viel einfacher.

Ihr Primärschlüssel wird wahrscheinlich etwas sein, für das Ihre Datenbank aus Leistungsgründen indiziert werden soll, und Sie können ihn aus technischen Gründen rechtzeitig ändern, z. B. von einer Zahl in eine Anleitung. Sie wissen nur nicht, aus welchen Gründen neue Technologien oder Kenntnisse vorliegen könnte dich nach unten führen. Ihr pk ist Ihr technischer Datenbestandteil, der öffentliche Schlüssel ist für den Endbenutzerverbrauch bestimmt.


7
Die Frage ist: "Ist es schlecht, Primärschlüssel freizulegen?" . Ihre Antwort: "Benutzer möchten möglicherweise ihre eigenen IDs haben" . Ich verstehe die Beziehung nicht. Ich lege dar InvoiceNumber, was für den Kunden eine Bedeutung hat und vom Kunden geändert werden kann, aber ich lege dar InvoiceID, was mein Code verwendet, um die Rechnung eindeutig zu identifizieren. Sie haben nicht zu (und oft nicht wollen auf) die Benutzer-Taste wird der Speicherschlüssel sein lassen. Bei dieser Frage handelt es sich um die letztere.
CodeCaster

Ich denke, dies ist ein gutes Beispiel, denn wenn Sie zu einer mandantenfähigen Version Ihrer APP wechseln, können Sie dieselbe Syntax beibehalten und mehrere Rechnungen mit demselben InvoiceNumber(für unterschiedliche Mandanten), aber mit unterschiedlichen Primärschlüsseln haben - ein Punkt (eine Art von) ) auch in der Antwort erwähnt.
13.11.13

1
@CodeCaster diese Frage handelt eigentlich von "Warum willst du nicht, dass sie gleich sind"?
Angelo Fuchs

In diesem Fall siehe Antwort von Telastyns .
CodeCaster

2

Für die meisten Anwendungen ist es ziemlich wichtig, dass Sie die Schlüssel den Benutzern zugänglich machen. Um ein Informationssystem effektiv zu nutzen, benötigen die Benutzer dieses Systems normalerweise eine Möglichkeit, die darin enthaltenen Informationen zu identifizieren und diese Informationen mit etwas in der Welt außerhalb der Datenbank in Beziehung zu setzen. In relationalen Datenbankbegriffen sind diese Bezeichner Schlüssel.

Ein häufig verwendetes Entwurfsmuster besteht darin, einen zusätzlichen, rein "technischen" Schlüssel für Datenbanktabellen als Abstraktionsmittel zu erstellen. Zum Beispiel, um einen stabilen (relativ unveränderlichen) Schlüssel bereitzustellen, bei dem sich ein alternativer Schlüssel ändern kann. Solche technischen Schlüssel sind für Endbenutzer normalerweise nicht zugänglich, da dies die beabsichtigte Abstraktion von den Benutzeranforderungen untergräbt. Es hat nichts mit Sicherheit zu tun.

Das in Ihrer Frage enthaltene Problem / Missverständnis beruht auf einer unangemessenen Verwendung des Begriffs Primärschlüssel . Ein Primärschlüssel ist nur einer von mehreren "Kandidaten" -Schlüsseln (mehrere mögliche Bezeichner in einer Datenbanktabelle). Der Primärschlüssel erfordert nicht unbedingt eine grundlegend andere Eigenschaft als jeder andere Schlüssel, sodass Behauptungen und Entwurfsprinzipien, die speziell für Primärschlüssel und nicht für andere Schlüssel gelten, immer verdächtig und häufig falsch sind.

Angesichts der Tatsache, dass Sie normalerweise einen Schlüssel für Ihren Benutzer bereitstellen müssen, was sollte dieser Schlüssel sein? Versuchen Sie, Ihre Schlüssel vertraut, einfach und stabil zu machen. Vertrautheit und Einfachheit erleichtern das Lesen und Merken von Schlüsseln und helfen, Fehler bei der Dateneingabe zu vermeiden. Stabilität bedeutet, dass sich der Schlüssel selten ändert, was auch dazu beiträgt, die Möglichkeit einer falschen Identifizierung zu vermeiden.


1
es kommt darauf an ... worauf? Ich möchte die Gründe für dieses generische Konzept herausfinden, um zu wissen, wann es anzuwenden ist und wann nicht.
Angelo Fuchs

1
Hallo Kunde, bitte geben Sie mir Ihren Ausweis, damit ich Ihnen helfen kann. Sicher, seine gfds789gxb3456bgfx789fgh98076hytd6734nhg5678nghf875nhgf456. Hmm, wie wäre es mit deinem sozialen? ... Ersatz-ID
Michael Durrant

@ Michael, Antwort aktualisiert. Ist das ein vertrauter, einfacher und stabiler Schlüssel?
nvogel

1

Dies ist aus einem Kommentar zu Greystone28s Antwort von CodeCaster. Es ist ein Beispiel für das, was Sie sagen:

Ich lege InvoiceNumber offen, die für den Kunden von Bedeutung ist und vom Kunden geändert werden kann, aber ich lege auch InvoiceID offen, mit deren Hilfe mein Code die Rechnung eindeutig identifiziert. Sie müssen den Benutzerschlüssel nicht zum Speicherschlüssel machen (und wollen es auch nicht). Bei dieser Frage handelt es sich um die letztere.

Welchen Zweck hat die Anzeige der InvoiceID in Ihrer App?

Ich gehe davon aus, dass Sie damit meinen, dass der Benutzer es sehen kann. Stellen Sie es nur zur Verfügung, wenn der Benutzer es zur Verwendung Ihrer App benötigt. Es kann vom technischen Support oder von Verwaltungspersonal verwendet werden. Ich habe mit einigen Apps gearbeitet, die dies tun. Dies erleichtert die Bereitstellung von Support, wenn ich den betreffenden Datensatz kenne.


Rechnungen haben natürliche Bezeichner (Nummern), aber nur für die, die Sie schreiben. Was ist mit denen, die du bekommst? Sie haben InvoiceNumbers, aber sie überschneiden sich (weil zwei Unternehmen dasselbe verwenden und Ihnen beide eine Rechnung senden). In dieser Situation ist Ihre InvoiceID eindeutig, die Nummer nicht, und was sie einzigartig macht, ist der Benutzername, der keine gute Kennung für Daten ist (zu lang, ändert sich zu oft, kann unklare Zeichen enthalten ...)
Angelo Fuchs,

@AngeloNeuschitzer - Wenn der Benutzer eine Rechnung anhand des Kundennamens und der Kundennummer eindeutig identifizieren kann, benötigt der Benutzer die InvoiceID PK nicht, die Datenbank und der zugrunde liegende Code können sie jedoch verwenden. Sie schließen sich gegenseitig aus.
JeffO

Siehe Fälle 1 - 3 meines Beispiels. In keinem Fall ist der Kundenname eine nützliche Methode, um dieses Objekt für den Benutzer (sei es Mensch oder Maschine) zu adressieren. InvoiceID PK ist.
Angelo Fuchs

1

Es ist völlig normal, dass Entitäten eine eindeutige Kennung haben, die der Außenwelt ausgesetzt ist. Für einige Objekte kann es möglich sein, eine Kennung zu finden, die tatsächlich eine Bedeutung hat (z. B. Rechnungsnummer), für andere jedoch ist keine solche Kennung vorhanden und muss daher generiert werden.

Aus Gründen der Konsistenz und Lesbarkeit empfehle ich, dass alle Entitäten in einem System den gleichen Typ und Namen für ihre Kennung verwenden. Normalerweise wird dieser Bezeichner <type> getId()in einer abstrakten Basisklasse verfügbar gemacht ( ).

Aus demselben Grund sollte jeder Dienst im System (z. B. Rechnungsdienst) identische Methoden für den Zugriff auf Entitäten anhand ihrer Kennung bereitstellen. Normalerweise wird diese Methode ( findById(<type> id)) von einer generischen Dienstschnittstelle oder Basisklasse geerbt.

Dieser Bezeichner muss nicht der Primärschlüssel der Entität sein, er kann jedoch einer sein. Man muss nur sicherstellen, dass die Strategie zur Schlüsselgenerierung einigermaßen eindeutige Kennungen erzeugt (nicht unbedingt universell eindeutig, aber zumindest innerhalb des Systems).

Wenn das System später in eine andere Datenbank migriert wird (nach meiner Erfahrung sehr umfangreich), ist es kein Problem, eine andere Strategie (die nicht auf Primärschlüsseln basiert) zum Erstellen der Bezeichner zu verwenden, solange die Strategie mit der ursprünglichen kompatibel ist.


Können Sie erklären, was in Ihrer Antwort in den anderen nicht beantwortet wurde?
Angelo Fuchs

2
In meiner Antwort bin ich zumindest mit den Punkten 2. und 3. Ihrer Zusammenfassung nicht einverstanden. Ich denke nicht, dass dies berechtigte Gründe dafür sind, PKs nicht als Objektkennungen zu verwenden.
Muton

0

Der Primärschlüssel befindet sich dort, genau wie ein Handle für das Tupel (Datensatz, Zeile), auf das Sie als Entwickler zugreifen möchten. Es wird auch in Bezug auf die referenzielle Integrität (Fremdschlüsseleinschränkungen) verwendet und hat möglicherweise auch einen oder mehrere Anwendungsfälle.

Im Grunde genommen ist es nichts Schlimmes, es Benutzern oder sogar Hackern auszusetzen. Weil mir kein Angriff bekannt ist, bei dem zum Beispiel der Primärschlüssel verwendet wird.

Aber in Bezug auf die Sicherheit haben wir viele Grundsätze (die wir akzeptieren und nicht akzeptieren) und die wir einhalten müssen:

  1. Das Prinzip des Pachtprivilegs
  2. Sicherheit durch Dunkelheit

Und einige andere Prinzipien. Was sie im Wesentlichen sagen, ist das:

Wenn Sie Ihre Daten nicht offenlegen müssen, warum sollten Sie das überhaupt tun?


Dem Griffteil stimme ich zu. Die Sicherheit geht nicht. Es mag sicherheitsrelevant sein, aber bei einem unabhängigen internen Schlüssel, der für den Benutzer nicht sichtbar ist, geht es meist nicht wirklich um Sicherheit. Ich würde das einen netten Nebeneffekt nennen.
JensG

Warum sollten Sie das Beispiel sehen, das ich der Frage hinzugefügt habe?
Angelo Fuchs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.