9
votes

Arrêtez de poster des données de différents domaines PHP

Je suis un débutant en PHP.

Ce que j'essaie de faire est d'arrêter de poster des données provenant d'une autre page Web.

Le problème que je dois dire, disons que quelqu'un copie ma forme et la colle sur leur site Web. Je veux pouvoir arrêter cette publication des données d'exécuter le script sur mon formulaire de messagerie.

Comment puis-je faire cela? Faites-moi savoir si je ne suis pas assez clair.

Mon formulaire de contact PHP fonctionne sur une page avec des déclarations conditionnelles. I.E. Si les données vérifient, soumettez.


4 commentaires

J'ai aussi essayé de vérifier l'URL en PHP, mais j'ai découvert que c'était une erreur amateur.


D'accord. J'ai regardé ce que vous m'avez donné, et j'ai pensé à une idée différente en utilisant ce que vous m'avez donné ... Et si je randomisez un ensemble de caractères => converti en une variable, posté comme la valeur cachée Donc, cela change à chaque fois et vérifiez que lorsque mon script fonctionne?


Erreur amateur à nouveau ..... Désolé.


Merci tout le monde! n'aurait pas pu le faire sans l'aide de tout le monde!


6 Réponses :


7
votes

$ _ serveur ['http_referrer'] serait bien mais ce n'est pas fiable. Vous pouvez utiliser un champ de formulaire caché que MD5 est quelque chose et que vous le vérifiez de l'autre côté.


11 commentaires

Et si je faisais randomisé le nombre et l'avez posté comme une valeur cachée, mais cela change.


Oh, attendez, ils peuvent simplement supprimer cette valeur cachée et le faire fonctionner .... lol. Dangit, juste quand je pense que je reçois les poignées de PHP.


Je pense que je l'ai finalement compris, j'ai utilisé Session_Start, a fait une variable de sessions lorsque le formulaire a été affiché, puis vérifié si la variable était définie pour soumettre!


Utilisez-vous des sessions de côté serveur?


Non, je n'utilise pas les sessions latérales du serveur. Et ma logique ci-dessus n'a pas marché. Désolé les gars.


Le seul problème quand je suis MD5 ma chaîne est que la personne peut saisir cette valeur cachée et la placer sur leur site. Cela ne fonctionnera que temporairement jusqu'à ce qu'une nouvelle chaîne soit générée sous la valeur cachée. En d'autres termes jusqu'à ce que quelqu'un rafraîchit la page.


Vous avez compris comment utiliser le référateur HTTP de cette page: Trap17.com/index.php/...


Vous ne pouvez pas faire confiance à http_referrer cependant, il est facilement spoofé.


Oui, j'utilise également le champ caché randomisé et je le contrôle avant de soumettre en utilisant des sessions. Toute autre idée utile pour vérifier l'identité de l'utilisateur unique et prévenir la CSRF?


Sans blague, à propos de spoofing facilement le référateur HTTP - j'ai utilisé le Firefox Ajouter sur: addons .Mozilla.org / fr-US / Firefox / Addon / 953 et a rapidement nettoyé le référateur, merci pour la tête!


Oh ok, je pensais que tu voulais dire que tu n'étais que vérifier le référent.



0
votes

Si vous recherchez une approche rapide et sale, vous pouvez vérifier l'en-tête de référateur.

Si vous voulez vraiment vous assurer que le formulaire a été récupéré de votre site cependant, vous devriez générer un jeton chacun Le temps est chargé et joignez-le à une session. Un moyen simple de faire ce serait quelque chose comme: xxx

alors votre formulaire peut avoir une entrée cachée: xxx

et vous pouvez vérifier que lorsque vous décidez de traiter vos données de formulaire.


1 commentaires

Avez-vous même besoin de vérifier le jeton en $ _post? Pourquoi ne pas simplement vérifier si la valeur de $ _session est toujours définie?



10
votes

Vous essayez d'empêcher CSRF - Demande de cross-sites Falsification . Jeff lui-même a un article de blog à ce sujet.

La prévention TRUE XSRF nécessite trois parties:

  • champs de saisie cachés, pour empêcher une personne de tirer simplement le formulaire et l'incorporer
  • Timechecking dans un EPSILON du formulaire généré, sinon une personne peut générer une forme valide une fois et utiliser le jeton (en fonction de l'impétermination / comment elle est stockée)
  • Cookies: Il s'agit d'empêcher un serveur malveillant de prétendre que c'est un client et effectuer une attaque man-in-the-intermédiaire

0 commentaires

2
votes

sous la forme:

$password = "mypass"; //same as above
if ($_POST['iphash'] == md5($password . $_SERVER['REMOTE_ADDR'])) {
    //fine
}
else {
    //error
}


4 commentaires

Remote_Addr peut être spoofed, donc s'il y avait une attaque MITM, cela serait sans valeur. En outre, après avoir fait une demande unique, je pouvais facilement faire plus en double duplication du hachage, qui rendrait cela sans valeur, la partie «unique» du hachage doit être plus «unique», c'est pourquoi j'ai choisi d'utiliser le temps () Sorcière fournit l'heure actuelle de l'époque.


L'attaquant n'est pas le client, son autre serveur servant une page de formulaire à ses clients .


De toute façon, cela peut encore arriver aussi facile.


Je crois que le même commentaire Ajax-Chargement à distance sur la réponse d'Unkwntech s'applique également à cela. La véritable protection XSRF nécessite des cookies, une entrée de forme cachée et des considérations sur le temps-epsilon.



10
votes

"réponse acceptée" a des trous de sécurité forts>. Au lieu de cela, vous devez utiliser des méthodes plus sécurisées. Un exemple simple:

étape 1: strong> désactiver l'encadrement de la page ( .php code>), dans lequel le formulaire est généré, dans le sommet Ajouter: P> XXX PRE>

ÉTAPE 2: (Pièce importante!): strong> Afin d'éviter les exploits XSS et 3ème partie, vous devez créer une validation expirable. Par exemple: p>

  • asp.net code> Les formulaires intégrés utilisent une entrée dynamique CSRF forte> (exemple de valeur: gtlkjh29f9ewduh024cfvefb code>) li>
  • WordPress code> Les formulaires intégrés utilisent une entrée dynamique nonce forte> (Exemple de valeur: 340297658942346 CODE>) LI> ul>

    Donc, si vous êtes sur une plate-forme personnalisée, ce qui n'a pas de méthodes de validation temporaire intégrées, puis mettez en œuvre votre approche. Un concept simple: p> xxx pré>

    (le code de cryptor est ici ) em> p>

    sur soumission, cochez: p>

    if(!empty($_POST)){
    
       // If REFERRER is empty, or it's NOT YOUR HOST, then STOP it
       if( !isset($_SERVER['HTTP_REFERRER']) || parse_url($_SERVER['HTTP_REFERRER'])['host'] != $_SERVER['HTTP_HOST'] ){
           exit("Not allowed - Unknown host request! ");
       }
    
       // Now, check if valid
       if (   Cryptor::decrypt(  $_POST['temp_random'], $_SERVER['REMOTE_ADDR'] . $secret_key) < time() - 60* 15 ) {
           exit("Not allowed - invalid attempt! ");
       }
    
       ...........................................
       ... Now, you can execute your code here ...
       ...........................................
    
    }
    


1 commentaires

Bien sûr, c'est la réponse la plus précise.



0
votes

Chaque utilisateur fait de l'inscription, puis obtenez un identifiant de connexion.

Suivant est un algorithme pour empêcher le CSRF: - P>

1) any json file with $refkey exists at server?

2) If $refkey exists, then check $login_id, $a_secret_key and $remote_addr exists and are correct.


0 commentaires