[ASP.Net Core]Daten nachträglich sichtbar machen/vor Crawler verstecken

  • C# (ASP)
  • (Core) Razor

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    [ASP.Net Core]Daten nachträglich sichtbar machen/vor Crawler verstecken

    Hallo Leute

    Ich progge im Moment eine ASP.Net Core Anwendung mit Razor-Pages sowie Bootstrap 4 und stehe im Moment am Schlauch.

    Ich muss eine Mailadresse bzw. eine Telefonnummer anzeigen lassen wobei diese nicht unmittelbar nach dem laden der Seite angezeigt werden soll sowie nicht im Quelltext auftauchen soll bzw. wenn dann in "verschlüsselter" Form. Muss jetzt nicht unbedingt verschlüsselt sein, aber eben nicht einfach so automatisiert auszulesen sein.

    Ich stelle mir das vor wie hier:
    willhaben.at/iad/kaufen-und-ve…012-90-x-100cm-423573365/

    Da sieht man nur die Vorwahl der Nummer und diese wird erst komplett sichtbar sobald man draufklickt.

    Um das klarzustellen, den Aufwendigen und komplizierten Weg kenne ich, alles selbst neu erfinden. Ich denke mir aber immer wieder das es z.b. mittels Bootstrap oder anderen Bibliotheken sowas in der Art ja sicher gibt und dachte mir ich frag mal nach ob jemand was relativ einfaches kennt. Mein Problem, in diesem Fall finde ich irgendwie nicht wirklich die richtigen Suchwörter die mich dem Ziel näher bringen, was mir sonst echt selten passiert ?(

    Liebe Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,

    die Lösung auf der Seite funktioniert auf meinem Android Handy nicht, denn in der Mobilversion wird direkt die Telefonnummer angezeigt.

    Im normalen Browser handelt es sich um zwei DIVs. Diese werden dynamisch befüllt, denn im eigentlichen Seitenquelltext sind diese noch nicht vorhanden.
    Optisch ist das dann ein ein und ausblenden der beiden DIVs.
    Ein Browser oder Crawler der erst JS lädt hat die Telefonnummer schon bevor diese durch klick sichtbar wird.
    Bilder
    • Unbenannt.PNG

      18,02 kB, 1.388×256, 71 mal angesehen
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Hallo

    Interessant, dann ist das in diesem Fall im Grunde ja nichtmal gut gelöst. =O
    Ja, ich dachte eben auch daran per AJAX nach einem Klick die Daten nachzuladen und dann einfach per JavaScript das InnerHtml des DIVS zu ändern.
    Das ist zumindest der manuelle Weg. Dachte nur das es evtl. einen "Trick" gibt, also z.b. eine Erweiterung um das ganze direkt im Model zu haben und mittels sowas wie @Html.HiddenToogleFor(m=> m.PhoneNumber) einfach einzubinden. Wäre ja cool.

    Ansonsten müsste ich es eh "manuell" machen, da ich aber mit JavaScript nicht so fit bin kann das dauern ;) Und in Asp.Net Core gibt es das "einfache" AJAX ja nicht mehr.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Wenn es wirklich nur OnClick sein soll, schau dir Mal fetch an
    developer.mozilla.org/en-US/do…API/Fetch_API/Using_Fetch

    Nachtrag: fetch geht natürlich auch in anderen Events.
    Aber OnClick würde bedeuten die Daten kommen wirklich erst per Interaktion ins DOM
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Hey, cool. Das sieht gut aus. Im Grund genau das was ich brauche.
    Habe sogar auf Anhieb ein Tutorial gefunden: docs.microsoft.com/en-us/aspne…cript?view=aspnetcore-5.0

    Mit dem Stichwort "fetch" findet man ja gleich was man brauch. Komisch ;)

    Danke dir!!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Relevanter Stackoverflow Post: stackoverflow.com/questions/74…mail-address-on-a-website
    Ich habe mich damit anfangs des Jahres auch schonmal beschäftigt, also wie man am besten eine E-Mail Adresse auf einer Website obfuskiert und es dann einfach gelassen. Aber in dem Post findest du noch ein ein paar Vorschläge dazu :)

    Das Problem ist halt, dass wenn es eine "beste" Lösung gäbe um z. B die E-Mail Adresse zu obfuskieren, dann würden die Bots diese Methode umgehen (weil es nur Obfuskierung ist lässt es sich ja immer umgehen) und damit wäre es nicht mehr die beste Lösung - ein Teufelskreis.
    Mfg
    Vincent

    Hy, danke für den Link, den werde ich auf jeden Fall auch durchgehen.

    VincentTB schrieb:

    dass wenn es eine "beste" Lösung gäbe

    Die "beste" Lösung suche ich garnicht. Schon klar das nix sicher ist, aber es soll hald nicht zu einfach sein und der User soll zumindest ein gewisses Maß an "Sicherheit" bekommen. Er muss es eh explizit freigeben das seine Mailadresse angezeigt werden darf. Aber selbst dann möchte ich diese eben erst nach einem klick anzeigen lassen damit nicht jeder Noob diese direkt im Quelltext auslesen kann.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Besten Dan an alle

    Ich bin heute dazu gekommen dieses Feature einzubauen und was soll ich sagen. Top. Das mit fetch ist nicht nur einfach sondern funktioniert auch super gut und schnell.
    Besten Dank an @VincentTB und @MrTrebron

    Hier meine Lösung für die Nachwelt:

    HTML-Quellcode

    1. @if (Model.CurrentMember.ShowMailPublic && !string.IsNullOrEmpty(Model.CurrentMember.Mail))
    2. {
    3. <div id="MailButtonContainer" class="mt-2 d-inline">
    4. <a class="btn btn-primary btn-sm" onclick="btnShowMailClick();">E-Mail</a>
    5. </div>
    6. }
    7. @if (Model.CurrentMember.ShowPhonePublic && !string.IsNullOrEmpty(Model.CurrentMember.Phone))
    8. {
    9. <div id="PhoneButtonContainer" class="mt-2 d-inline">
    10. <a class="btn btn-primary btn-sm" onclick="btnShowPhoneClick();">Telefonnummer</a>
    11. </div>
    12. }


    Quellcode

    1. <script>
    2. function btnShowMailClick() {
    3. getMail();
    4. }
    5. function btnShowPhoneClick() {
    6. getPhone();
    7. }
    8. const mailuri = 'GetMailJson?userId=@Model.CurrentMember.ID';
    9. const phoneuri = 'GetPhoneJson?userId=@Model.CurrentMember.ID';
    10. function getMail() {
    11. fetch(mailuri)
    12. .then(response => response.json())
    13. .then(data => _displayMail(data))
    14. .catch(error => console.error('Unable to get data.', error));
    15. }
    16. function getPhone() {
    17. fetch(phoneuri)
    18. .then(response => response.json())
    19. .then(data => _displayPhone(data))
    20. .catch(error => console.error('Unable to get data.', error));
    21. }
    22. function _displayMail(data) {
    23. document.getElementById('MailButtonContainer').innerHTML = data;
    24. }
    25. function _displayPhone(data) {
    26. document.getElementById('PhoneButtonContainer').innerHTML = data;
    27. }
    28. </script>


    Und im Controller die zwei Methoden welche ein Json zurückgeben:

    C#-Quellcode

    1. public async Task<IActionResult> GetMailJson(int userId)
    2. {
    3. var user = await _userManager.GetUserById(userId);
    4. if (user.ShowMailPublic)
    5. {
    6. return Json(user.Mail);
    7. }
    8. else
    9. {
    10. _telemetry.TrackEvent("Unerlaubter versuch die Mailadresse eines Benutzers aufzurufen!", new Dictionary<string, string>() { { "Username", HttpContext.User.Identity.Name } });
    11. return Json("Nicht erlaubt!!");
    12. }
    13. }
    14. public async Task<IActionResult> GetPhoneJson(int userId)
    15. {
    16. var user = await _userManager.GetUserById(userId);
    17. if (user.ShowPhonePublic)
    18. {
    19. return Json(user.Phone);
    20. }
    21. else
    22. {
    23. _telemetry.TrackEvent("Unerlaubter versuch die Telefunnumer eines Benutzers aufzurufen!", new Dictionary<string, string>() { { "Username", HttpContext.User.Identity.Name } });
    24. return Json("Nicht erlaubt!!");
    25. }
    26. }


    So ist es genau so wie ich es machen wollte. TOP!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##