PDA

View Full Version : سوال: ارسال یک ID به صفحه دیگر



amin7x
چهارشنبه 20 دی 1391, 11:11 صبح
سلام

ببخشید بابت این تاپیک چون گفته بودن برای هر سوال یک تاپیک جداگانه بزنید.

من اگه یخوام یک id که توی یک متغیر ذخیره شده رو بدون باگ SQL Injection به یک صفحه دیگه بفرستم چه کاری انجام بدم؟

من قبلا این طوری می فرستادم (ای دی رو با استفاده از mysql_fetch_array از دیتابیس گرفتم):



<?php
$id=1;
?>
<a href="more.php?id=<?php echo $id ?>"> ادامه مطلب </a>


توی صفحه more هم با متد get میگرفتمش.
ولی فقط کافی یک کوتیشن به اون اضافه کنی که باگ SQL ضاهر بشه.

حالا اگه روش بهتری دارید به من بگید.

ممنون

dousti_design
چهارشنبه 20 دی 1391, 11:32 صبح
توی صفحه more باید فیلتر اعمال کنید با استفاده از تایع:
mysql_real_escape_string() (http://php.net/manual/en/function.mysql-real-escape-string.php)
راهنما + مثال:
پیشگیری از حملات sql injection (http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php)

mamali-mohammad
چهارشنبه 20 دی 1391, 11:35 صبح
اینجا نیاز به کاری نیست
توی صفحه more.php از mysql_escape_real_string استفاده کن

siavashsay
چهارشنبه 20 دی 1391, 12:35 عصر
دوست عزیز !
شما به 2 صورت میتونی برای فرستادن متغیر به صفحه دیگه استفاده کنی !
یکی همین روش GET که البته در این روش امکان دستکاری توسط کاربر هست !
اما با استفاده تابع mysql_real_escape_string میتونی اونو فیلتر کنی :

$id=$_GET['id'];
$id=mysql_real_escape_string($id);
روش دوم استفاده از session هست که دیگه کاربر نمیتونه اون رو دستکاری کنه !
در صفحه اول این کد رو اجرا میکنید و ازون به بعد در هر صفحه ای که خواستید میتونید از $_SESSION['id'] استفاده کنید

$_SESSION['id']=$id;
حالا اگر خواستید بازهم میتونید از


$id=mysql_real_escape_string($_SESSION['id']);

و اون رو فیلتر کنید برای احتیاط بیشتر !
موفق باشید

ravand
چهارشنبه 20 دی 1391, 12:58 عصر
این روش هایی که شما گفتید هیچ کدوم امنیت این روش رو نداره:

if((!isset($_GET["id"])) or ($_GET["id"]=="") or (!is_numeric($_GET["id"]))){
header("Location:HTTP/1.0 404 Not Found");
exit;
}else{
$IDGET =$_GET['id'];
}
این دستور به مقدار ارسالی میگی آقا ، اگه هیچ عددی نیستی برو بیرون :لبخند:

rezaonline.net
چهارشنبه 20 دی 1391, 14:47 عصر
یه راه حل خوب برای جلوگیری از sqlinjection استفاده از شناسه عددی هست .
میتونید به اطمینان 100 درصد جلوی نفوذ رو بگیرید .

$id = (int) $_GET['id'] ;
mysql_query("SELECT * FROM post WHERE id={$id}");

iner30
چهارشنبه 20 دی 1391, 15:10 عصر
اولین پستها رو خوندم داشتم فکر میکردم اگه id عدد باشه که استفاده از is_numeric از همه راحتتره ، پس چرا دوستان راه حل های دیگه پیشنهاد میدن!!!

حالا دوستانی که استفاده از توابع sql رو پیشنهاد دادن ، آیا تابع is_numeric امنیت نداره و میشه اونو دور زد؟ چه جوری؟

ravand
چهارشنبه 20 دی 1391, 15:54 عصر
شما نه تنها عدد بودن رو باید چک کنید بلکه نبودن عدد رو هم باید چک کنید.

if((!isset($_GET["id"])) or ($_GET["id"]=="") or (!is_numeric($_GET["id"]))){
header("Location:HTTP/1.0 404 Not Found");
exit;
}else{
$IDGET =$_GET['id'];
}
الان این دستور من میگه اگه آی دی وجود نداره یا مقدار خالی هست یا مخالف عدد هست یعنی عدد نیست از صفحه خارج شو وگرنه مقدار رو برای فیلد آی دی ارسال کن.

siavashsay
چهارشنبه 20 دی 1391, 17:12 عصر
اولین پستها رو خوندم داشتم فکر میکردم اگه id عدد باشه که استفاده از is_numeric از همه راحتتره ، پس چرا دوستان راه حل های دیگه پیشنهاد میدن!!!دوست عزیز توی این مورد شما خودت مشخص نکردی که منظورت از ID چی هست !
قابل توجه دوستانی که خودشون میدونن ID در اصل از واژه identity میاد که به معنای ( شناسه - مشخصه - هویت و ... ) هست و میتونه هر چیزی باشه!
پس الزاما یک عدد نیست که دوستان از توابعی مثل is_numeric و ... استفاده کردن !
این فقط چیزی هست که بین ما عرف شده که ID یعنی عدد ! بقیه دوستان هم قصد گمراه کردن ندارن فقط توضیح جامع دادن !
وگرنه شما میتونی از تابع ctype_alnum استفاده کنی !
این تابع چک میکنه که ورودی شما فقط از ( اعداد و حروف ) باشه نه چیز دیگه که اگر اینطور گمونم بیشتر به کار شما بیاد !

با تشکر

Tarragon
چهارشنبه 20 دی 1391, 17:14 عصر
اما اینجا بنظر فقط عدد هست.

rezaonline.net
چهارشنبه 20 دی 1391, 17:25 عصر
is_numeric اعداد منفی و اعشاری رو هم true برمیگردونه ، بهتره از ctype_alnum استفاده کنید که جناب سیاوش خان فرمودند .

siavashsay
چهارشنبه 20 دی 1391, 17:38 عصر
اما اینجا بنظر فقط عدد هست.
توی برنامه نویسی به نظر خیلی چیزا خیلی چیزهای دیگس !
و توی همین به نظرهاس که یهو سایت down میشه ! :)

ravand
چهارشنبه 20 دی 1391, 18:06 عصر
خب الان ما میخوایم یه صفحه ای رو فراخوانی بکنیم یک شماره میدیم به id . خب برای این ما از تابع in_numberic می تونیم عدد بودن یا نبودنش رو بررسی بکنیم.
این تابع ctype_alnum کارش اینه که مقدار ورودی رو بررسی میکنه اگر عدد یا حروف بود true بر می گردونه ولی اگر کاراکتر مثلا @ \ بود هیچ پیغامی نمیده.

<?php
if (ctype_alnum("@")) {
echo "ok";
}
?>
حالا به نظر من همون تابع is_numberic بهتره.

siavashsay
چهارشنبه 20 دی 1391, 19:13 عصر
خب الان ما میخوایم یه صفحه ای رو فراخوانی بکنیم یک شماره میدیم به id . خب برای این ما از تابع in_numberic می تونیم عدد بودن یا نبودنش رو بررسی بکنیم.
این تابع ctype_alnum کارش اینه که مقدار ورودی رو بررسی میکنه اگر عدد یا حروف بود true بر می گردونه ولی اگر کاراکتر مثلا @ \ بود هیچ پیغامی نمیده.

<?php
if (ctype_alnum("@")) {
echo "ok";
}
?>
حالا به نظر من همون تابع is_numberic بهتره.
دوست عزیز ! شما دیگه چرا ؟!
شما باید دستور else رو بکار ببری ! معلومه که پیغامی نمیده چون کاراکتر شما مجاز نیست ! شما باید در صورت غیر مجاز هم پیغامی رو صاد کنی :


$a="@hi\Hello World , 123";
if(ctype_alnum($a)){
echo "ok";
}else{
echo "no";
}

ravand
چهارشنبه 20 دی 1391, 19:27 عصر
دوست عزیز ! شما دیگه چرا ؟!
شما باید دستور else رو بکار ببری ! معلومه که پیغامی نمیده چون کاراکتر شما مجاز نیست ! شما باید در صورت غیر مجاز هم پیغامی رو صاد کنی :
من دارم چی میگم شما داری چی میگی :لبخند:
عزیز بحث این حرف ها نیست منم میدونم اگه else رو بذاری میشه این کارا رو کرد منظور من چیز دیگه ای بود. شما میگی میشه با تابع ctype_alnum بهتر از تابع in_numberic ازش استفاده کرد. ولی من میگم نه. چون تابع ctype_alnum بود و نبود عدد و حروف رو بررسی میکنه . در صورتی که با تابع in_numberic میشه بود و نبود فقط عدد رو بررسی کرد. ما که قرار نیست به id حروف بدیم که!!!!!

siavashsay
چهارشنبه 20 دی 1391, 19:40 عصر
اتفاقا بحث ما سر همینه !
شما اگر پست های بالا رو میخوندی متوجه میشدی !
بنده گفتم ایشون مشخص نکردن که منظورشون از ID یک نوع متغیر عددی هست ! بقیه دوستان واسه خودشون توابع بررسی عدد رو عنوان کردن ! در صورتی که ID فقط عدد نیست ! میتونه تلفیقی از ( عدد و حروف ) هم باشه !
از اونجایی که ایشون مشخص نکردن بحث فقط سر عدد هست ما هم تابع ctype_alnum که از اسمش معلوم هست ( alnum = alphabet + Number ) مثال زدیم !
مجدد عرض میکنم : ID مخفف کلمه Identity یعنی ( شناسه - مشخصه - هویت و ... ) هست ! پس میشه هر چیزی باشه ! نه اینکه در جایی که عنوان نمیشه ما یهو فک کنیم که ID یعنی عدد !

ravand
چهارشنبه 20 دی 1391, 19:43 عصر
ما کاری نداریم گه id مخفف چی می باشد. :لبخند:
برو پست اول رو ببین حتی مثالش رو هم گذاشته که منظورش ارسال یک عدد به آی دی هست.

<?php
$id=1;
?>
<a href="more.php?id=<?php echo $id ?>"> ادامه مطلب </a>

siavashsay
چهارشنبه 20 دی 1391, 19:56 عصر
ظاهرا داره میشه چت روم !:قهقهه:
شما تاپیک رو نگاه کن متوجه میشی ! گفتن ID !
حتی در این قسمت :

اولین پستها رو خوندم داشتم فکر میکردم اگه id عدد باشه که استفاده از is_numeric از همه راحتتره ، پس چرا دوستان راه حل های دیگه پیشنهاد میدن!!!
خودشون گفتن ( اگر عدد باشه ) یعنی الزاما عدد نبوده ! حالا شاید برای مثال بی حوصلگی به خرج دادن و عدد 1 رو وارد کردن !
در هر صورت موفق باشید جناب ravand

iner30
پنج شنبه 21 دی 1391, 09:42 صبح
siavashsay من که از پستات استفاده کردم و قانع شدم
ولی شماهم دل به نویسنده پستها نمیدیها :چشمک: شروع کننده مبحث شخص دیگری بود ... من فقط وسط بحث سوال پرسیدم

rezaonline.net
پنج شنبه 21 دی 1391, 15:42 عصر
این مطلب خالی از لطف نیست
http://shgn.ir/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-pdo-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AF%D8%B1-php/