• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

e-gold Shopping Cart Interface

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
کسی اسکریپتی سراغ داره که egold SCI را با php پیاده سازی کرده باشه ؟

اینکه از روی سایت ما دکمه پرداخت را بزنه وارد سایت ایگلود بشه و دوباره اطلاعات پرداخت را به سایت ما برگرداند و مسائل امنیتی مثل اینکه طرف چند بار این فرم ارسالی از ایگلود را به سایت ما ارسال نکند و اینکه اطلاعات از سایت خود ایگولد دریافت شود رعایت شده باشد !
 

sama_sally

Registered User
تاریخ عضویت
5 آپریل 2005
نوشته‌ها
2,598
لایک‌ها
1
سن
36
محل سکونت
Essen, Deutschland
قسمت اسکریپت آماده برای اینطور مواقع ساخته شده... موفق باشی
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
من فکر کردم این انجمن برای گذاشتن اسکریپت است نه درخواست !!!

بهرحال ممنون و منتظرم ...
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
کار زیاد سختی نیست
من دو سه سال پیش نوشتم ولی الان نمی دونم کجاست !
بر فرض اینکه برنامه نویسی بلدی یا کس دیگری می تونه برات بنویسه

اون اطلاعاتی که egold می فرسته رو که مشکلی نیست و با یک $_POST اونا رو در میاری
که لیستش تو همون فایل SCI هست
مهمترینش که ایناست

PAYEE_ACCOUNT
PAYMENT_AMOUNT
PAYMENT_UNITS
PAYMENT_BATCH_NUM
PAYER_ACCOUNT

خوب اما موردهای امنیتی
اولین چیزی که مهمه IP هست که اطلاعات رو POST کرده
تو این فایلی که دارم IP ایگلد اون زمان 63.240.230.5 بوده الان رو نمی دونم

وقتی این مرحله رد شد شما باید حساب گیرنده رو چک کنی که با حساب خودت یکی باشه !
چون طرف راحت می تونی یه فورم درست کنه و فقط status url رو ماله شما رو بزاره و شما فکر کنی چیزی پرداخت شده !
PAYEE_ACCOUNT

بعدش میرسیم سر واحد پولی که طرف می رسه یا همون PAYMENT_UNITS
چون طرف موقع پرداخت می تونه این رو واحد پول ایتالیا بزاره و 100 واحد پول اینالیا هم بفرسته شاید چند سنت هم نشه ! و چک کنی که حتما دلار باشه
که دلار رو با عدد یک مشخص کردند که فقط چک کنی PAYMENT_UNITS برابر با 1 باشه


مواقعی پیش می یاد که یا سرور ایگلد سرش شلوغه یا سرور شما سرش شلوغه
که وقتی ایگلد اطلاعات رو می فرسته اگر تا n دقیقه جوابی نگیره فرم رو دوباره ارسال می کنه !!!
این n رو الان یادم نیست چند ثانیست
ولی ایگلد اگه ریسپانس نگیره تا 4 بار این فرم رو ارسال می کنه
برای اینکه این مشکل پیش نیاد شما یه شرط می زاری که اون table مربوط به پرداختها رو چک کنه و اگه batch number پیدا شد دیگه ادامه نده

من خودم اینارو پیدا کرده بودم و مشکلی هم نبود چون همه راهها بسته میشه

شما دست به کار شو اگذ مشکلی بود همین جا بگو
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
به نقل از artin :
کار زیاد سختی نیست
من دو سه سال پیش نوشتم ولی الان نمی دونم کجاست !
بر فرض اینکه برنامه نویسی بلدی یا کس دیگری می تونه برات بنویسه

اون اطلاعاتی که egold می فرسته رو که مشکلی نیست و با یک $_POST اونا رو در میاری
که لیستش تو همون فایل SCI هست
مهمترینش که ایناست

PAYEE_ACCOUNT
PAYMENT_AMOUNT
PAYMENT_UNITS
PAYMENT_BATCH_NUM
PAYER_ACCOUNT

خوب اما موردهای امنیتی
اولین چیزی که مهمه IP هست که اطلاعات رو POST کرده
تو این فایلی که دارم IP ایگلد اون زمان 63.240.230.5 بوده الان رو نمی دونم

وقتی این مرحله رد شد شما باید حساب گیرنده رو چک کنی که با حساب خودت یکی باشه !
چون طرف راحت می تونی یه فورم درست کنه و فقط status url رو ماله شما رو بزاره و شما فکر کنی چیزی پرداخت شده !
PAYEE_ACCOUNT

بعدش میرسیم سر واحد پولی که طرف می رسه یا همون PAYMENT_UNITS
چون طرف موقع پرداخت می تونه این رو واحد پول ایتالیا بزاره و 100 واحد پول اینالیا هم بفرسته شاید چند سنت هم نشه ! و چک کنی که حتما دلار باشه
که دلار رو با عدد یک مشخص کردند که فقط چک کنی PAYMENT_UNITS برابر با 1 باشه


مواقعی پیش می یاد که یا سرور ایگلد سرش شلوغه یا سرور شما سرش شلوغه
که وقتی ایگلد اطلاعات رو می فرسته اگر تا n دقیقه جوابی نگیره فرم رو دوباره ارسال می کنه !!!
این n رو الان یادم نیست چند ثانیست
ولی ایگلد اگه ریسپانس نگیره تا 4 بار این فرم رو ارسال می کنه
برای اینکه این مشکل پیش نیاد شما یه شرط می زاری که اون table مربوط به پرداختها رو چک کنه و اگه batch number پیدا شد دیگه ادامه نده

من خودم اینارو پیدا کرده بودم و مشکلی هم نبود چون همه راهها بسته میشه

شما دست به کار شو اگذ مشکلی بود همین جا بگو
ممنون آرتین جان !

من هم منظورم همین مسائل امنیتی بود که چه مواردی را باید رعایت کنم که نکات آنرا برام گفتی !
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
خوب اما موردهای امنیتی
اولین چیزی که مهمه IP هست که اطلاعات رو POST کرده
تو این فایلی که دارم IP ایگلد اون زمان 63.240.230.5 بوده الان رو نمی دونم

با چه پارامتری ؟

از HTTP_REFERER نمی خواهم استفاده کنم

کد:
Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
PHP:
$_SERVER['REMOTE_ADDR']

البته گفتم باید IP رو دوباره چک کنی من مطمئن نیستم الان هم همین باشه ولی قاعدتا نباید عوض شده باشه !

اون Agent و REFERER هم همون طوری که خودش گفته آنچنان چیزی نیست که بخوای روش مانور بدی
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
ارتین جان !

REMOTE_ADDR آیپی کلاینت را به من میده نه IP سروری که فرم ارسال شده است !!!!
 

mohsenshahbazi

همکار بازنشسته
کاربر فعال
تاریخ عضویت
21 ژوئن 2004
نوشته‌ها
4,025
لایک‌ها
3,825
محل سکونت
اصفهان
ببین ..وقتی یه سرور یه اطلاعاتی رو به سایت شما ارسال میکنه ..یعنی ارسال کننده و یا همون کلاینت اونه !

شما اگه تو کار با کاربر از remote-addr استفاده کنی میشه ای پی کاربر !
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
وقتی یه سرور یه اطلاعاتی رو به سایت شما ارسال میکنه ..یعنی ارسال کننده و یا همون کلاینت اونه !

این حرف شما درست !!! ولی مهم اینجاست که کاربر روی سایت ایگلود دکمه سابمیت را می زنه که دوباره اطلاعات پرداخت ارسال بشه به سایت ما !! درسته ؟
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
یکی از فیلدهایی که به status_url می فرسته V2_HASH می باشد که من با چک کردن IP فکر نکنم نیاز باشه که درست بودن آنرا چک کنم . چون مطمئینم اطلاعات پرداخت از سرور ایگلود ارسال شده است . درسته ؟
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
منکه این اسکریپت را نوشتم .
قسمت status_url آنرا اینجا می گذارم که بدرد دوستان دیگر شاید بخوره :

کد:
<?php
//	phpinfo();
	$egold_ip="63.240.230.";
	$myegold="2942502";
	
	$remote_ip=explode(".",$_SERVER["REMOTE_ADDR"]);
	include("config.php");
	mysql_connect($host,$dbuser,$dbpass) or die("Sorry ! Currently Our e-gold gateway is down . Please try later ...");
	mysql_select_db($dbname) or die("Sorry ! Currently Our e-gold gateway  is down . Please try later ...");

	$pos=strpos($_SERVER["REMOTE_ADDR"], $egold_ip);
	if ($pos === false ) die(" checking IP .... ");
	if($myegold!=$_POST["PAYEE_ACCOUNT"]) die(" checking Payee account .... ");
	if($_POST["PAYMENT_UNITS"]!=1) die(" checking Payment Unit .... ");
	if($_POST["PAYMENT_METAL_ID"]!=1) die(" checking Metal ID .... ");
	
	$sql="Update orders set amount=".$_POST["PAYMENT_AMOUNT"];
	$sql.=" , batch=".$_POST["PAYMENT_BATCH_NUM"];
	$sql.=" , PAYER_ACCOUNT=".$_POST["PAYER_ACCOUNT"];
	$sql.=" , ACTUAL_PAYMENT_OUNCES=".$_POST["ACTUAL_PAYMENT_OUNCES"];
	$sql.=" , USD_PER_OUNCE=".$_POST["USD_PER_OUNCE"];
	$sql.=" , FEEWEIGHT=".$_POST["FEEWEIGHT"];
	$sql.=" where tid='".$_POST["PAYMENT_ID"]."'";	
	$q=safe_query($sql);
	
	$body="
		amount=".$_POST["PAYMENT_AMOUNT"]."\n
		batch=".$_POST["PAYMENT_BATCH_NUM"]."\n
		PAYER_ACCOUNT=".$_POST["PAYER_ACCOUNT"]."\n
		ACTUAL_PAYMENT_OUNCES=".$_POST["ACTUAL_PAYMENT_OUNCES"]."\n
		USD_PER_OUNCE=".$_POST["USD_PER_OUNCE"]."\n
		FEEWEIGHT=".$_POST["FEEWEIGHT"]."\n
		tid=".$_POST["PAYMENT_ID"]."\n";
	mail("[email protected]", "e-gold Payment Recieved ! " ,  $body);
	
	

	
?>

فکر نکنم مشکلی داشته باشه این اسکریپت . در عین حال سوالی بود یا نکته ای که رعایت نشده بود گوشزد کنید ... :)
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
adnan
خوبه که کد رو گذاشتی آخه یه چیز رو یادت رفته که من گفته بودم
اگه یادت باشه گفتم که در صورتی که سرور شما یا ایگلد مشکل داشتن باشن یعنی وقتی ایگلد فرم پرداخت رو برای شما پست می کنه مشکلی باشه و جواب دریفات نکنه ایگلد دوباره برات فرم رو می فرسته فکر می کنم هر 10 ثانیه یه بار و این عمل 4 بار انجام میشه
خوب شما یه شرط اضافه کن که دیتابیس رو چک کنه در صورتی که چنین batch number قبلا وارد دیتابیس شده دیگه ادامه نده و بیاد بیرون
شاید سرور شما براش مشکلی پیش نیاد که البته آدم همیشه صد در صد مطمئن نیست ولی برای ایگلد مشکل زیاد پیش می یاد پس بهتره با یه شرط کوچیک از این مشکل جلوگیری کرد
 

adnan

Registered User
تاریخ عضویت
5 اکتبر 2003
نوشته‌ها
1,249
لایک‌ها
10
محل سکونت
مشهد
آرتین جان ! اتفاقا نکته ای که گفته بودی هم رعایت شده !

به قسمت شرط آپدیت دیتابیس توجه کن :
کد:
$sql.=" where tid='".$_POST["PAYMENT_ID"]."'";

Payment ID های من یکتا است که قبل از اتصال به ایگولد این رکورد ایجاد شده است و اطلاعات پرداخت روی این رکورد آپدیت می شود .
چنانچه بر فرض شما ، چهار بار ایگلود اطلاعات را بفرسته ، رکورد هم 4 بار آپدیت میشه و 4 پرداخت محسوب نمیشه و درنتیجه مشکلی پیش نمیاد !

جواب این سوال من در این پست را هم ندادی ؟ http://forum.persiantools.com/showpost.php?p=732951&postcount=12
 

artin

کاربر تازه وارد
تاریخ عضویت
19 می 2004
نوشته‌ها
2,114
لایک‌ها
2
من آخه با دقت کدت رو نگاه نکردم اون مورد دوم هم من که استفاده نمی کردم و مشکلی پیش نیومد
 
بالا