web-dev-qa-db-fra.com

Existe-t-il un moyen de masquer le code source HTML tout en le maintenant efficace?

J'ai un site Web avec un formulaire de contact HTML côté client créé manuellement (pas en tant que sortie d'un constructeur HTML comme PHP):

<form action="mailto:[email protected]">
    Email Adress:<br>
    <input type="email" name="email_address" value="" maxlength="100" />
    <br>
    <input type="submit" value="Submit" />
</form>

Je voudrais cacher que mailto:[email protected] à partir de tous les codes source HTML qui l'incluent, afin que les utilisateurs ne puissent pas trouver l'adresse e-mail même dans le code source directement;
De cette façon, seuls les clients qui m'ont envoyé un e-mail et obtenu une réponse --- connaissent généralement l'adresse e-mail (sauf si l'utilisateur a annulé l'opération de masquage).

Existe-t-il un moyen de masquer le code source HTML tout en le maintenant efficace?

Mise à jour

En lisant calmement toutes les réponses, il semble que ma question reposait sur une fausse hypothèse: j'ai raté beaucoup de temps que mailto afficherait toujours l'e-mail tel quel dans le client de messagerie d'un utilisateur (et peut-être aussi avant celui-ci dans l'aperçu dans le bord inférieur gauche du port d'écran du navigateur); Je pense que j'ai raté cela parce qu'un biais cognitif de la combinaison de réponses suggérant l'obscurcissement du code source et une phrase redondante à mon avis comme La question n'a même pas de sens au niveau conceptuel; que j'ai essayé de supprimer dans un montage (qui a été partiellement approuvé, malheureusement). Je comprends maintenant que quoi que je fasse, peu importe comment je brouillerai le code source; l'e-mail que j'ai inséré dans mailto finira toujours par apparaître dans un client de messagerie utilisateur appliqué à un navigateur (s'il y en a un - sinon, il n'y aurait tout simplement pas d'effet d'envoi d'e-mail).

23
user123574

Tu ne peux pas. La question n'a même pas de sens sur le plan conceptuel. UNE mailto: le lien est simplement un moyen pratique de communiquer avec un utilisateur final auquel il peut envoyer un e-mail. Si votre lien mailto fonctionne, l'utilisateur final par définition saura où va l'e-mail, de la même manière que l'utilisateur final par définition saura où se trouve un lien cliquer va aller.

Vous devrez vous demander quel problème vous essayez de résoudre; Si vous souhaitez masquer le nom des destinataires, vous pouvez le faire en créant des adresses e-mail masquées ou même temporaires sur votre serveur de messagerie et en transférant le courrier aux destinataires réels de celles-ci, de la même manière que les raccourcisseurs d'URL peuvent être utilisés pour masquer le - réelle destination d'un lien, mais un utilisateur toujours verra l'adresse e-mail à laquelle il est envoi car c'est ainsi que fonctionne l'e-mail.

56
Cubic

Vous ne pouvez pas masquer le HTML et vous attendre à ce que le navigateur puisse l'interpréter. Le navigateur a besoin d'un accès complet au HTML afin d'afficher toutes les parties du site. Dès que le navigateur y a accès, l'utilisateur peut également y accéder.

Par ailleurs, JavaScript n'est pas non plus en mesure de "masquer" le contenu du site et de le rendre accessible au navigateur, et donc à l'utilisateur final, pour la même raison.

130
MechMK1

Eh bien, à mon humble avis, le seul moyen fiable d'empêcher l'utilisateur de connaître l'adresse e-mail pour avoir le courrier envoyé côté serveur au lieu du côté client. Dit différemment, le client ne donne que sa propre adresse e-mail et le texte, il est téléchargé sur le serveur par le formulaire et le courrier est envoyé par l'application serveur qui est la seule partie connaissant l'adresse du destinataire.

Ceci est couramment utilisé dans les centres d'aide pour empêcher les utilisateurs d'utiliser directement leurs adresses internes.

101
Serge Ballesta

Tu ne peux pas. Et Javascript non plus. Vous avez trois options, et elles dépendent toutes d'une langue de backend. Vous avez deux options, une bonne façon et deux façons folles si vous n'avez pas de serveur:

La bonne façon: Vous faites un formulaire à soumettre à un serveur, et le serveur gère cet e-mail via SMTP.

La façon correcte: Vous soumettez à un autre domaine ou API qui peut le gérer côté serveur.

The crazy way: Vous écrivez une application de bureau qui est enregistrée dans votre propre protocole d'URL personnalisé et les paramètres incluent le corps du formulaire. Votre consommateur installe cette application de bureau et gère silencieusement cet e-mail via SMTP au lieu d'ouvrir son client de messagerie. Le courrier de destination peut être codé en dur dans cette application et il ne peut pas l'obtenir à moins qu'il ne décompile ou fasse un vidage de mémoire. Au lieu de "mailto: email.com", il devient "custom-mail:" sans le courrier.

Voilà ce qu'est "mailto". Il s'agit d'un protocole enregistré auprès de l'OS. Cependant, gardez à l'esprit que si vous comptez sur leur client et "mailto", peu importe ce que vous faites. Ils le verront à la seconde où leur client ouvrira, donc vous n'avez vraiment rien résolu ici.

15
The Anathema

Vous pouvez l'encoder en HTML, comme ceci:

<form action="&#x6d;&#x61;&#x69;&#x6c;&#x74;&#x6f;&#x3a;&#x73;&#x6f;&#x6d;&#x65;&#x6f;&#x6e;&#x65;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;">

Cependant, cela ne fait que l'obscurcir. Tout le monde peut décoder cela.

Si vous voulez vraiment le cacher, vous avez besoin d'une fonctionnalité côté serveur (PHP), où le formulaire est soumis au serveur et le serveur vous l'envoie par e-mail.

11
Sjoerd

TL; DR: Non.

Si je comprends bien votre problème, vous ne voulez pas cacher l'adresse e-mail aux utilisateurs, mais aux bots qui analysent le code source pour collecter les adresses e-mail pour le spam.

Bien sûr, en JavaScript, il existe plusieurs façons simples de réduire ce problème à pratiquement zéro, car il nécessite l'exécution du script, ce que pratiquement aucun spammeur ne fait:

function getEMailAddr(user, domain) {
   return user + '@' + domain;
}

et alors:

link = document.createElement('A');
link.href = 'mailto:' + getEMailAddr('example', 'something.com');

En HTML simple, il n'y a aucun moyen de le faire. Cependant, il existe certaines possibilités de réduire la surface d'attaque des parseurs stupides. Le signe at très accrocheur peut être exprimé comme des entités HTML &at; ou &#64;, de sorte que les analyseurs qui ne recherchent que @ ne les trouve pas. Ces entités HTML sont également autorisées dans les valeurs d'attribut, telles que href.

7
rexkogitans

Pour accomplir ce que vous essayez de faire, obtenez une adresse Gmail ou une adresse de transfert que vous utilisez dans votre formulaire, ce qui vous permet de garder secrète votre véritable adresse e-mail.

6
Lort Fasd

Vous ne pouvez pas masquer le HTML du navigateur. Le HTML est un langage de balisage côté client, ce qui signifie qu'il est chargé par le navigateur côté client, donc le navigateur doit pouvoir l'interpréter.

Comme quelqu'un l'a mentionné, vous ne pourrez pas accomplir ce que vous essayez d'accomplir avec la façon dont vous le faites. Vous pourriez être en mesure d'accomplir quelque chose de proche en codant/décodant des éléments selon les besoins, cependant, la sécurité par l'obscurité n'est pas une stratégie recommandée, et n'importe qui peut facilement décoder une chaîne codée.

4
Justin

Réponse alternative.

Oui, il existe, essayez de voir la source de https://samy.pl/ c'est presque impossible à trouver, vous devez être assez dévoué pour le trouver, mais le site Web fonctionne bien.

Mais plus sérieusement, le code est toujours visible, c'est juste hors de portée de la plupart des utilisateurs, même ceux qui ont une idée de l'endroit où chercher.

HTML/JS est entièrement exécuté côté client, il est donc impossible de ne pas le donner au client à traiter.

La partie que vous souhaitez spécifiquement masquer déclenche réellement dans le navigateur client, un lien mailto est un lien indiquant à l'ordinateur d'ouvrir un client de messagerie et de pré-remplir le formulaire. Donc, même si vous avez fait ce que fait Samy, cliquer sur le lien s'ouvrira simplement dans le client de messagerie et montrera à l'utilisateur final l'adresse e-mail.

Si vous souhaitez garder le secret, l'e-mail doit être envoyé côté serveur

3
exussum

Comme d'autres l'ont dit, vous ne pouvez pas masquer le HTML. Cependant, il semble que vous ne souhaitiez pas particulièrement cacher le HTML, vous voulez juste que le destinataire du formulaire ne soit pas visible dans votre code, ce qui est assez simple selon votre framework.

Par exemple, si vous utilisez PHP, PHP Mailer est un moyen assez simple d'envoyer un e-mail, et puisque PHP est géré côté serveur, lorsque votre formulaire est soumis) l'utilisateur ne verra jamais votre adresse e-mail si vous n'en voulez pas trop.

Si vous utilisez ASP.NET ou autre, simplement en tapant le nom de votre environnement et votre e-mail dans votre moteur de recherche préféré, vous aurez probablement beaucoup d'options sur la façon d'envoyer un e-mail et vous pouvez le combiner avec votre formulaire pour le faire. du côté serveur.

2
aslum

TL; DR: Non, vous ne pouvez pas masquer le code source HTML. Vous ne pouvez masquer l'adresse e-mail que pour différer les spammeurs tant que vous n'utilisez pas de code côté serveur.

Outre l'utilisation d'entités HTML (&#x6d;) ou Javascript, vous pouvez également utiliser XSLT pour l'obscurcissement, si vous utilisez XHTML au lieu de HTML.

XSLT est un langage de programmation basé sur XML pris en charge par tous les principaux navigateurs qui peut transformer n'importe quel XML en une autre forme (XML, HTML, Plaintext, etc.). Une application serait de passer par la plupart du document à l'exception des attributs action qui contiennent une partie magique, par exemple +rot13.

Un avantage est que cela fonctionne également dans les navigateurs où Javascript est désactivé. Une mise en garde est que vous devez écrire du XHTML, donc au lieu des navigateurs HTML clairs, utilisez l'analyseur XML strict, qui provoque des messages d'erreur sur chaque erreur de syntaxe.

Veuillez également garder à l'esprit que chaque technique d'obfuscation HTML ne peut que différer les spammeurs. Le navigateur a besoin du lien mailto correct pour faire la bonne chose lors de la soumission du formulaire, de sorte que l'utilisateur verra éventuellement l'adresse non masquée.

index.xhtml

<?xml-stylesheet type="text/xsl" href="obfuscation.xsl" ?>
…
<form action="mailto+rot13:fbzrbar$rknzcyr.pbz">
    Email Adress:<br/>
    <input type="email" name="email_address" value="" maxlength="100" />
    <br/>
    <input type="submit" value="Submit" />
</form>

obfuscation.xsl

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:html="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" encoding="UTF-8"/>

<!-- Identity Transformation for HTML nodes -->
<xsl:template match="@*|html:*">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<!-- decode form actions with a ROT-13 variant  -->
<xsl:template match="@action[contains(substring(., 0, 16), '+rot13:')]">
    <xsl:attribute name="action"><xsl:value-of select="substring-before(., '+')"/>:<xsl:value-of select="translate(substring-after(., ':'),'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@$6789012345', 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm$@1234567890')" /></xsl:attribute>
</xsl:template>

</xsl:stylesheet>
1
cg909

Cela ne peut pas être fait pour un lien mailto, mais il existe des services comme MailThis , Formspree , qui vous permettent de créer un formulaire qui publie sur leur serveur, et ils convertiront que d'envoyer un e-mail. MailThis vous permet également de créer un nom d'alias afin de ne pas exposer votre véritable adresse e-mail sur la page HTML elle-même.

1
Lie Ryan