PDA

View Full Version : تکه کد حساب کاربری یک فروشگاه



nineteen
سه شنبه 20 بهمن 1388, 21:09 عصر
سلام
این تکه کد مربوط هست به بخش حساب کاربری یک سایت که در اون سبد خرید هم نمایش می دهد حال می خوام اگر ممکن هست این کد رو توضیح بدین


<?php if(!session_is_registered("userid") && !session_is_registered("user") )
header("Location: index.php?open#login");
?>
<?php

if(isset($_GET["buy"])){
$re = mysql_query("select * from films where id='$_GET[code]'");
while($row = mysql_fetch_array($re)){
$ree = mysql_query("select id from buy where userid='$_SESSION[userid]' and filmid='$_GET[code]' ");
$num = mysql_num_rows($ree);
if($num==0){
mysql_query("insert into buy values('$id', '$row[faname]', '$row[enname]', '$row[id]', '$row[price]', '$row[part]', '$row[kargardan]', '$_SESSION[userid]', '$_SESSION[user]') ");

}else{
print "<script> alert('فیلمی که انتخاب کردید در سبد خرید شما موجود است') </script>";
}
}
}
if(isset($_GET["delete"])){
mysql_query("delete from buy where id='$_GET[code]'");
}
if(isset($_GET["exit"])){
session_unregister("userid");
session_unregister("user");
header("Location: index.php");
}
?>
<?php
$re = mysql_query("select name, money from users where id='$_SESSION[userid]'");
list($name, $money ) = mysql_fetch_array($re);
?>

امیـرحسین
سه شنبه 20 بهمن 1388, 22:08 عصر
اول اینکه این اسکریپت قدیمی هست و احتمالا روی سرورهای فعلی خطا میده بخاطر استفاده از آرایه بدون کوتیشن.
دوم اینکه سایتی که از این اسکریپت استفاده کرده رو لوع ندید چون اسکریپت حفره امنیتی از نوع SQL Injection داره.

این یه اسکریپت سبد خرید سادست که مثلا لیست فیلم رو به کاربر نشون میده و کاربر فیلمها رو به سبدش اضافه کنه و یا از سبدش حذف کنه.

nineteen
سه شنبه 20 بهمن 1388, 22:29 عصر
این فقط یک پروژه هست که می خوام به استادم نشون بدم حالا دارم تحیلی می کنم به یک تحیلی کامل نیاز دارم که قسمت هایی که پایین گفتم رو نمی فهمم البته منظورم تمامی کد هایی که در زیرش هم قرار می گیره هست اگه ممکن هست این قسمت ها رو توضیح بدین


if(isset($_GET["buy"])){ و if(isset($_GET["delete"])){

davoodi
چهارشنبه 21 بهمن 1388, 00:22 صبح
جناب امیر حسین مشکل امنیتی این کد رو تشریح میکنید ؟
چون من اکثر کدهام رو شبیه به این مینویسم. میخوام بدونم کجای کارم اشکال داره.
ممنون میشم :چشمک:

fafa_na
چهارشنبه 21 بهمن 1388, 08:10 صبح
سلام


<?php if(!session_is_registered("userid") && !session_is_registered("user") )
header("Location: index.php?open#login");
?>

اين تكه كد را مطمئن نيستم ولي انگار چك ميكنه كه نام كاربري و رمز عبور وارد شده يا به وسيله نوار آدرس ، ادرس را وارد كرد،كه اگه از نوار آدرس وارد شده باشه به صفحه index پرتش ميكنه.انگار نام و رمز عبور با seesion يا همون نشست به اين صفحه منتقل شدن


if(isset($_GET["buy"])){
$re = mysql_query("select * from films where id='$_GET[code]'");
while($row = mysql_fetch_array($re)){
$ree = mysql_query("select id from buy where userid='$_SESSION[userid]' and filmid='$_GET[code]' ");
$num = mysql_num_rows($ree);
if($num==0){
mysql_query("insert into buy values('$id', '$row[faname]', '$row[enname]', '$row[id]', '$row[price]', '$row[part]', '$row[kargardan]', '$_SESSION[userid]', '$_SESSION[user]') ");

}else{
print "<script> alert('فیلمی که انتخاب کردید در سبد خرید شما موجود است') </script>";
}
}
}اينم وقتي اجرا ميشه كه بر روي جنس كه انگار فيلم كليك كنه (به منظور خريد)با اين كار دو متغيير $_GET[code]و$_GET["buy
مقدار ميگيرن و چك ميكنه آيا قبلا اين جنس را انتخاب كرده كه اگه انتخاب كرده پيغام ميده وگرنه به جدول اضافه ميكنه



if(isset($_GET["delete"])){
mysql_query("delete from buy where id='$_GET[code]'");
}
اينم ممكن از انتخاب خودش پشيمون بشه و بر روي لينك حذف كليك كنه كه فيلم يا جنس انتخاب شده حذف ميشود



if(isset($_GET["exit"])){
session_unregister("userid");
session_unregister("user");
header("Location: index.php");
}
اينم وقتي روي لينك خروج يزنه باعث ميشه دو seesion اول بودن كه مقدار گرفته بون از بين بره و كاربر خارج بشه



اميدوارم جوابم براتون مفيد باشه:لبخندساده:

nineteen
چهارشنبه 21 بهمن 1388, 08:23 صبح
بسیار عالی بود
خیلی خیلی ممنون

امیـرحسین
پنج شنبه 22 بهمن 1388, 14:20 عصر
جناب امیر حسین مشکل امنیتی این کد رو تشریح میکنید ؟
چون من اکثر کدهام رو شبیه به این مینویسم. میخوام بدونم کجای کارم اشکال داره.
ممنون میشم :چشمک:
تحت هیچ شرایطی نباید داده های کاربر رو مستقیم داخل کوئری قرار داد!
مثلا توی خط زیر. مقدار code از URL خونده شده و توی کوئری قرار گرفته:
$re = mysql_query("select * from films where id='". $_GET['code'] ."'");
حالا اگر من این آدرس رو اجرا کنم چی؟

http://domain/some-page.php?code=1'; DELETE FROM films WHERE '1
اون وقت کوئری به این تبدیل میشه:
$re = mysql_query("select * from films where id='1'; DELETE FROM films WHERE '1'");
برای برطرف کردنش باید کوتیشنها رو خنثی کرد! توسط تابع mysql_real_escape_string.
می تونید از تابع زیر که نمونه اش تو همین فروم قبلا معرفی شده استفاده کنید:
/**
* Escape strings to use in SQL commands.
*
* @param string $str String to escape.
* @param resource $conn Current DB Connection if exists.
* @return string Escaped string.
*/
function escape($str, $conn=null)
{
if(get_magic_quotes_gpc())
$str = stripslashes($str);

if(function_exists('mysql_real_escape_string') && $conn)
return mysql_real_escape_string($str, $conn);
else
return mysql_escape_string($str);
}