[BUGREPORT] Possibilità di acquistare a costo zero.
Inviato: 30/09/2006, 18:48
E' stato segnalato un bug critico in osC 2.2MS2 che consente in teoria di acquistare prodotti a costo zero:
http://www.oscommerce.com/community/contributions,4573
Questa la procedura:
1) change the currency value.
2) correct it in the adress bar to currency=EUR from currency=Eur (or USD with Usd if you prefer)
3) make an order and complete it
Il problema effettivo si presenta nel caso di vendita di beni digitali, scaricabili immediatamente dopo pagamento con cc.
Il bug non si trova nella classe currencies, ma nella query interna alla funzione tep_currency_exists:
La query non tiene conto di una caratteristica della select di MySQL che, a differenza di Oracle, è case insensitive, cioè non distingue frà maiuscole e minuscole.
Questo fa si che in presenza, ad es, del codice di valuta USD, anche il codice Usd o usd, risulta rilevato dalla query.
D'altra parte il PHP è case sensitive, quindi il codice valuta risulta inesistente e, conseguentemente, il valore rispetto alla valuta di default risulta zero.
Il fix corretto a questo bug consiste nel modificare la query in modo da tener conto del case del codice valuta, aggiungendo la parola chiave "binary":
La soluzione proposta in origine non risolve completamente il problema. Se ad es il codice della valuta dollaro viene inserito dal merchant erroneamente in minuscolo (usd), il problema si ripresenta.
Saluti
Marcus
http://www.oscommerce.com/community/contributions,4573
Questa la procedura:
1) change the currency value.
2) correct it in the adress bar to currency=EUR from currency=Eur (or USD with Usd if you prefer)
3) make an order and complete it
Il problema effettivo si presenta nel caso di vendita di beni digitali, scaricabili immediatamente dopo pagamento con cc.
Il bug non si trova nella classe currencies, ma nella query interna alla funzione tep_currency_exists:
Codice: Seleziona tutto
$currency_code = tep_db_query("select currencies_id from " . TABLE_CURRENCIES . "
where code = '" . tep_db_input($code) . "'");
Questo fa si che in presenza, ad es, del codice di valuta USD, anche il codice Usd o usd, risulta rilevato dalla query.
D'altra parte il PHP è case sensitive, quindi il codice valuta risulta inesistente e, conseguentemente, il valore rispetto alla valuta di default risulta zero.
Il fix corretto a questo bug consiste nel modificare la query in modo da tener conto del case del codice valuta, aggiungendo la parola chiave "binary":
Codice: Seleziona tutto
function tep_currency_exists($code) {
$code = tep_db_prepare_input($code);
$currency_code = tep_db_query("select currencies_id from " . TABLE_CURRENCIES . " where binary code = '" . tep_db_input($code) . "'");
if (tep_db_num_rows($currency_code)) {
return $code;
} else {
return false;
}
}
Saluti
Marcus