Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Echanges développeurs _ Problème de sécurité avec invoice.php

Écrit par : diaph 3 Dec 2014, 08:28

Bonjour,
J'ai placé un invoice.php " classique non pdf " côté client, pour que mes clients puissent imprimer leurs factures.
La facture s'affiche très bien et est imprimable.
Le problème est que je n'arrive pas à sécuriser la facturation, n'importe qui peut, en étant connecté sur son compte, imprimer une autre facture concernant un autre client !!!
Voici le code de départ de ma page invoice.php:

Code
<?php
/*
  $Id: invoice.php,v 1.6 2003/06/20 00:37:30 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
*/

require_once('includes/application_top.php');

   if (!tep_session_is_registered('customer_id')) {
    $navigation->set_snapshot();
    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  }
  
require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ORDERS_INVOICE );

//require(DIR_WS_CLASSES . 'currencies.php');
// prevents reinclusion if called from checkout_process.php
require_once(DIR_WS_CLASSES . 'currencies.php');
$currencies = new currencies();

//include(DIR_WS_CLASSES . 'order.php');
// prevents reinclusion if called from checkout_process.php
//require_once(DIR_WS_CLASSES . 'order.php');

  $oID = tep_db_prepare_input($HTTP_GET_VARS['oID']);
  $orders_query = tep_db_query("select orders_id from " . TABLE_ORDERS . " where orders_id = '" . (int)$oID . "'");

  include(DIR_WS_CLASSES . 'order.php');
  $order = new order($oID);
  // création de la sécurité pour la récupération des factures pdf
// récupération de l'id de client de la commande en cours
$verif_order = tep_db_query("SELECT customers_id FROM " . TABLE_ORDERS . " WHERE orders_id = " . $oID . "");
$verif = tep_db_fetch_array($verif_order);

// comparaison des id des clients pour attester le client en cours
if($verif['customers_id'] == (int)$customer_id)
{
// fin debut sécurité
// début fin sécurité
}
else
{
echo TEXT_ALERT_SECURIT;
}
// fin sécurité
?>
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html <?php echo HTML_PARAMS; ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET; ?>">
<title><?php echo TITLE; ?></title>
<link rel="stylesheet" type="text/css" href="includes/stylesheet.css">
<link href="stylesheet.css" rel="stylesheet" type="text/css">
</head>
<body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF">

<!-- body_text //-->


Merci à ceux qui savent, de me conseiller voir de me dépatouiller !
wacko.gif

Écrit par : chti_poupon 3 Dec 2014, 12:04

Bonjour
Il me semble bien que ce problème est réglé au début de catalog/account_history_info.php en 2.2Rc1:

Code
  if (!tep_session_is_registered('customer_id')) {
    $navigation->set_snapshot();
    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  }

  if (!isset($HTTP_GET_VARS['order_id']) || (isset($HTTP_GET_VARS['order_id']) && !is_numeric($HTTP_GET_VARS['order_id']))) {
    tep_redirect(tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL'));
  }
  
  $customer_info_query = tep_db_query("select customers_id from " . TABLE_ORDERS . " where orders_id = '". (int)$HTTP_GET_VARS['order_id'] . "'");
  $customer_info = tep_db_fetch_array($customer_info_query);
  if ($customer_info['customers_id'] != $customer_id) {
    tep_redirect(tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL'));
  }

Le client doit être connecté, le numéro de commande exister et l'id du client correspondre à celui enregistré dans la commande: dans tout cas contraire, il est renvoyé dans ses buts.

Que dire de plus?
Chti poupon

Écrit par : diaph 3 Dec 2014, 13:20

Bonjour chti_poupon,
Merci pour la réponse.
J'ai appliqué ce code sur mon invoice, mais ça me renvoi systématiquement sur account_history_info.php...

Écrit par : chti_poupon 3 Dec 2014, 17:34

Ben dame !
il faut adapter les lignes

Code
tep_redirect(tep_href_link(FILENAME_ACCOUNT_HISTORY, '', 'SSL'));

au nom FILENAME_... de ton invoice
Bon code !
Chti poupon

Écrit par : diaph 3 Dec 2014, 19:35

Oui certe !
Je l'ai compris après avoir répondu...
Mais maintenant j'ai le message suivant sur mon navigateur:
La page n'est pas redirigée correctement

"Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas.

La cause de ce problème peut être la désactivation ou le refus des cookies."

Voici mon code:

Code
require('includes/application_top.php');
  require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_ORDERS_INVOICE);
  
if (!tep_session_is_registered('customer_id')) {
    $navigation->set_snapshot();
    tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  }

  if (!isset($HTTP_GET_VARS['order_id']) || (isset($HTTP_GET_VARS['order_id']) && !is_numeric($HTTP_GET_VARS['order_id']))) {
    tep_redirect(tep_href_link(FILENAME_ORDERS_INVOICE, '', 'SSL'));
  }
  
  $customer_info_query = tep_db_query("select customers_id from " . TABLE_ORDERS . " where orders_id = '". (int)$HTTP_GET_VARS['order_id'] . "'");
  $customer_info = tep_db_fetch_array($customer_info_query);
  if ($customer_info['customers_id'] != $customer_id) {
    tep_redirect(tep_href_link(FILENAME_ORDERS_INVOICE, '', 'SSL'));
  }

  $breadcrumb->add(NAVBAR_TITLE_1, tep_href_link(FILENAME_ORDERS, '', 'SSL'));
  $breadcrumb->add(NAVBAR_TITLE_2, tep_href_link(FILENAME_ORDERS_INVOICE, '', 'SSL'));
  $breadcrumb->add(sprintf(NAVBAR_TITLE_3, $HTTP_GET_VARS['order_id']), tep_href_link(FILENAME_ORDERS_INVOICE, 'order_id=' . $HTTP_GET_VARS['order_id'], 'SSL'));
  
  require(DIR_WS_CLASSES . 'order.php');
  $order = new order($HTTP_GET_VARS['order_id']);

pourtant les cookies sont bien activés.
J'ai fais un essai avec les lignes $breadcrumb, mais celà ne change rien.

Écrit par : Havock 4 Dec 2014, 09:48

Bonjour,

As tu essayé avec un autre navigateur ?

Si le pb ne se produit qu'avec Firefox regarde une piste : http://vite-une-solution-doc.blogspot.fr/2012/12/comment-faire-lorsquune-page-firefox.html

Écrit par : diaph 4 Dec 2014, 10:48

Merci pour le conseil smile.gif
J'ai le même message avec Safari, je pense plutôt qu'il sagit d'un problème de code, à l'origine le fichier invoice.php est prévu pour l'Admin, pas pour le côté client, mais je ne sais pas ou est la faille !

Écrit par : chti_poupon 4 Dec 2014, 11:32

Bonjour
Il ne faut pas rediriger vers invoice.php, car, faute de nouvelle information, on part sur une boucle infinie...que le navigateur refuse !
L'exemple donné plus haut est extrait de catalog/account_history_info.php qui redirige vers account_history.php.
Il faut renvoyer vers la page qui a appelé catalog/invoice.php
Bon code !
Chti poupon

Écrit par : diaph 4 Dec 2014, 15:51

Bonjour et merci pour le soutien,
C'est account_history_info.php ou account_history.php qui envoie ver mon invoice.php, mais la facture ne s'affiche pas et ça me renvoie toujours sur mon account_history.php.
Donc, la seule option que j'ai, c'est de renvoyer vers FILENAME_ACCOUNT_HISTORY, comme dans account_history_info.php, puisque c'est justement cette page qui appelle invoice.php. On tourne en rond !
J'ai oublié de préciser, que pour rendre la facture imprimable, je n'ai PAS de:

Code
<!-- header //-->
<?php require(DIR_WS_INCLUDES . 'header.php'); ?>
<!-- header_eof //-->
, le problème ne viendrait-il pas de ça ?
J'ai aussi essayer de mettre la sécurité de mon ancien ivoice.php en PDF:
Code
// récupération de l'id de client de la commande en cours
$verif_order = tep_db_query("SELECT customers_id FROM " . TABLE_ORDERS . " WHERE orders_id = " . $oID . "");
$verif = tep_db_fetch_array($verif_order);

// comparaison des id des clients pour attester le client en cours
if($verif['customers_id'] == (int)$customer_id)
{
// fin debut sécurité

// création du pdf
// fin du pdf
// début fin sécurité
}
else
{
echo TEXT_ALERT_SECURIT;
}
// fin sécurité

mais ça ne fonctionne pas, parsque je n'arrive pas à métriser le code, j'ai des alertes diverses, mais la page ne s'affiche jamais.
Galère !

Écrit par : chti_poupon 5 Dec 2014, 12:48

Il semble que la page invoice.php soit appelée sans le paramètre en GET ?orders_id=5684...
Cette page doit s'ouvrir pour impression directe et non collecter des données - ce qui apparemment est fai
Peux-tu vérifier si le lien qui apparaît dans la barre d'état quand la souris est sur le bouton "invoice" de account_history.php finit bien par

Citation
?order_id=903752
?
Belle journée !
Chti poupon

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)