Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: płatności internetowe - podmiana ceny w formularzu ?
Forum PHP.pl > Forum > PHP
Janoszczak
Witam,

tworzę sklep internetowy i przeglądając zasady działania systemów płatności zdiwił mnei fakt iż wszędzie operacja polega na przesłaniu formularza metodą POST. W przeglądarkach FireFox dostępne są wtyczki umożliwiające wyświetlenie zmiennych POST i podmianę ich zawartości. Dlatego zwracam się z pytaniem, czy np taki "sprrytny" klient nie może przed potwierdzeniem wysłania formularza submitem, podmienić sobie zamówienia za 150zł na np. 130?

Prosze o wyjasnienie jak to jest dokladnie? Moze cos zle pojmuje ?

Z gory dziekuje za pomoc

Pozdrawiam ;] guitar.gif
Darti
Jeżeli jest tak napisany skrypt, że cenę produktu pobiera z bazy tylko raz a potem przesyła formularzem przez POST lub GET czy inny REQUEST to faktycznie możliwe byłoby podmienienie tej wartości. Pisząc jednak taki system istnieje zasada maksymalnej nieufności w stosunku do uzytkownika i tam, gdzie to możliwe korzysta się z własnych danych, tak więc na następnej stronie sprawdza się znowu cenę w bazie danych na podstawie przesłanego przez formularz id produktu.
Janoszczak
Rozumiem twoja odpowiedź, jednak jest pewien mankament, albowiem taki formularz wygląda dla platnosci.pl np tak:

<form action="https://www.platnosci.pl/paygw/ISO/NewPayment"
method="POST" name="payform">
<input type="hidden" name="pos_id" value="12345">
<input type="hidden" name="session_id" value="1234565">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="desc" value="Opis płatnosci">
<input type="hidden" name="pay_type" value="t">
<input type="hidden" name="client_ip" value="123.123.123.123">
<input type="hidden" name="js" value="0">
<input type="submit" value="Zapłać poprzez Platnosci.pl">
</form>

Jak widać formularz przekierowywany jest do platnosci.pl gdzie nie mamy mozliwosci pobrania i sprawdzenia naszej ceny z bazy, albowiem to nie nasz serwer. Natomiast w pozniejszej odpowiedzi zwrotnej z platnosci.pl ktorej celem jest weryfikacja zakupu nie otrzymujemy wartosci "amount" czyli ceny ktora wyslalismy w 1 zadaniu.

Jednymi slowy, klient przed kliknieciem submita "Zapłać poprzez Platnosci.pl", podmieni wartosc amount POSTa i wysle ządanie bezpośrednio do platnosci.pl.

Widzialem jeszcze dopisanie po tym formularzu opcji:

<script language="JavaScript" type="text/javascript">
<!--
document.forms['payform'].js.value=1;
-->
</script>

jednak nie znam sie za bardzo na JS i moze ktos moglby wyjasnic do czego ten JS sluzy?
PiratNowegoPokolenia
poczytaj dokładnie tą dokumentacje techniczną

Wydaje mi się że użytkownik może wpłacić dowolną kwotę.
Twój sklep musi pobrać informacje o transakcji jeśli się odbyła (3.7.2.), sprawdzić czy wpłacono odpowiednią kwotę i oznaczyć sobie jako transakcje dokonaną.
Cysiaczek
Ewentualnie spróbuj wysłac skrypt najpierw do siebie, sprawdź dane i potem cURL'em tuneluj do platnosci.pl

Pozdrawiam.
Janoszczak
"poczytaj dokładnie tą dokumentacje techniczną

Wydaje mi się że użytkownik może wpłacić dowolną kwotę.
Twój sklep musi pobrać informacje o transakcji jeśli się odbyła (3.7.2.), sprawdzić czy wpłacono odpowiednią kwotę i oznaczyć sobie jako transakcje dokonaną."

Otoz wlasnie platnosci.pl zwracja na podany url tylko:

pos id - identyfikator Punktu Płatności
session_id - wartość podana przez Sklep w trakcie tworzenia nowej transakcji
ts - znacznik czasowy, wartość potrzebna w celu weryfikacji podpisu (czas w formacie UNIX TIMESTAMP)
sig - podpis przesłanej informacji - patrz punkt 3.4 Dokumentacji technicznej

Nie widzę tutaj żadnej informacji i kwocie jaką przeslana zostala w 1 formularzu. Więc jak to sprawdzić?

Jedynym sensownym rozwiązaniem byłoby przesłanie formularza nie do platnosci.pl lecz do swojego skryptu, ktory z sesji odczytalby czy uprzednio zapisana wartosc zamowienia pokrywa sie z ta z formularza, a nastepnie automatycznie przeslal formularz dalej do platnosci.pl. Jednak jak utworzyc formularz bez pola submit i spowodowac aby byl przesylany automatycznie pod wskazany url?

Moze przedstawie to w krokach:

1) user w koszyku klika zamow
2) skrypt oblicza koncowa wartosc zamowienia, zapisuje sa w sesji i tworzy formularz taki jak w platnosciach lecz a innym urlem (naszego innego skryptu)
3) nasz skrypt sprawdza wartosc kwoty (czy ta z sesji pokrywa sie z ta z formularza)
if (tak) -> automatycznie wysyla forma juz pod prawidlowy adres platnosci.pl
if(NIE) -> wyswietla userowi informacje ze wystapil blad bo kwota sie nie zgadza i zeby user sobie w kulki nie lecial nastepnym razem bo jestesmy super pro hackers i nie z nami takie numery aaevil.gif (chyba mnie ponioslo) ;]
4) dalej tranzakcja przebiega normalnie

Co o tym myslicie? Chyba dobre rozwiazanie? Tylko jak spostowac dane automatycznie ;]

PS.

A co do Curla to jest to pomysl, jednak wolalbym go obejsc ;]

Pozdrawiam i dziekuje za kolejne komentarze ;]
jakal
Pewnie mój post dużo nie wniesie, ale jestem ciekaw rozwiązania tego problemu, bo też za niedługi czas będę integrował stronę z platnosci.pl

- Może wyślesz meila do działu technicznego platnosci.pl i spytasz się o rozwiązania?
konraddo
Z tego co wywnioskowalem z dokumentacji to:
Przed wysłaniem do płatnosci.pl ustalasz wlasny session_id, ktory razem z innymi danymi zwiazanymi z transakcja zapisujesz w bazie (np. na stronie podsumowania), gdzie na dole zamieszczasz ten formularz:
  1. <form action="https://www.platnosci.pl/paygw/ISO/NewPayment"
  2. method="POST" name="payform">
  3. <input type="hidden" name="pos_id" value="12345">
  4. <input type="hidden" name="session_id" value="1234565">
  5. <input type="hidden" name="amount" value="1000">
  6. <input type="hidden" name="desc" value="Opis płatnosci">
  7. <input type="hidden" name="pay_type" value="t">
  8. <input type="hidden" name="client_ip" value="123.123.123.123">
  9. <input type="hidden" name="js" value="0">
  10. <input type="submit" value="Zapłać poprzez Platnosci.pl">
  11. </form>

potem kiedy platnosci.pl zwroci ci dane:
pos id - identyfikator Punktu Płatności
session_id - wartość podana przez Sklep w trakcie tworzenia nowej transakcji
ts - znacznik czasowy, wartość potrzebna w celu weryfikacji podpisu (czas w formacie UNIX TIMESTAMP)
sig - podpis przesłanej informacji - patrz punkt 3.4 Dokumentacji technicznej

sprawdzasz za pomocą session_id oraz danych transakcji w bazie, ktore wczesniej tam umiesciles czy dane są poprawne
jesli nie anulujesz transakcje, jak to jest napisane w dokumentacji:
W celu anulowania lub odrzucenia płatnosci wywołujemy procedure Payment/cancel.

ale jak to sie robi to dokładnie to nie wiem
Kocurro
Sprawdzenie tego czy klient wpłacił odpowiednią sumę należy do Ciebie.

Po otrzymaniu callback'a z informacją o dokonaniu płatności Twój skrypt musi sprawdzić czy sess_id jest poprawny. Jeśli tak to wypytujesz serwis płatności o informacje na temat transakcji (podając pos_id, sess_id i key), dostajesz informacje. Sprawdzasz. Reagujesz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.