web-dev-qa-db-fra.com

Détermination du référent dans PHP

Quel est le moyen le plus fiable et le plus sûr de déterminer quelle page soit envoyée, ou appelée (via AJAX), la page actuelle. Je ne veux pas utiliser le $_SERVER['HTTP_REFERER'], en raison de la (manque de) fiabilité, et j'ai besoin que la page appelée vienne uniquement de requêtes provenant de mon site.

Edit: Je cherche à vérifier qu'un script qui effectue une série d'actions est appelé depuis une page de mon site Web.

101
UnkwnTech

REFERER est envoyé par le navigateur du client dans le cadre du protocole HTTP et n’est donc pas fiable. Il se peut que ce ne soit pas là, ce soit contrefait, vous ne pouvez pas y croire si c'est pour des raisons de sécurité.

Si vous souhaitez vérifier si une requête provient de votre site, vous ne pouvez pas le faire, mais vous pouvez vérifier que l'utilisateur s'est déjà rendu sur votre site et/ou qu'il est authentifié. Les cookies sont envoyés AJAX demandes afin que vous puissiez compter sur cela.

90
Seldaek

Ce que j’ai trouvé de mieux, c’est un jeton CSRF et le sauvegarder dans la session pour les liens sur lesquels vous devez vérifier le référant.

Donc, si vous générez un rappel FB, cela ressemblerait à ceci:

$token = uniqid(mt_Rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

Ensuite, le fichier index.php ressemblera à ceci:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

Je connais des sites sécurisés qui font l’équivalent pour toutes leurs pages sécurisées.

23
We0

Utilisation de $ _ SERVER ['HTTP_REFERER']

L'adresse de la page (le cas échéant) qui a renvoyé l'agent d'utilisateur à la page en cours. Ceci est défini par l'agent utilisateur. Tous les agents utilisateurs ne le définiront pas, et certains offrent la possibilité de modifier HTTP_REFERER en tant que fonctionnalité. En bref, on ne peut pas vraiment faire confiance.

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;
15
AMB

Après avoir lu tous les faux problèmes de référent, il ne nous reste plus qu’une option: la page que nous souhaitons suivre en tant que référent doit être conservée en session, et ajax appelée puis en enregistrant la session si elle a une valeur de page et en effectuant l’action autrement no action.

Tandis qu’il demande une page différente, définissez la valeur de la session de référence sur null.

Rappelez-vous que la variable de session est définie sur la demande de page désirée uniquement.

0
justnajm

Il n'y a pas de moyen fiable pour vérifier cela. C'est vraiment sous la main du client de vous dire d'où ça vient. Vous pouvez imaginer utiliser des informations de cookie ou de session uniquement sur certaines pages de votre site Web, mais vous risqueriez de rompre l’expérience utilisateur grâce aux signets.

0
gizmo