PDA

View Full Version : سوال: امنیتی کردن $_GET



abbaszz
دوشنبه 23 بهمن 1391, 10:06 صبح
سلام. فرض کنید صفحه ای دارم که به صورت زیر اطلاعاتی رو به صفحه دیگه ای میفرسته برای یه سری عملیات:


var url = 'do.php';
url = url + '?v1=' + v1;
...

حالا اگه همچین لینکی بدیم :
do.php?v1=5

صفحه do.php کار خودشو میکنه.
چطور میشه جلوی این رو گرفت؟ یعنی کاربر بصورت دستی نتونه اطلاعاتو بفرسته به do.php

tehro0n
دوشنبه 23 بهمن 1391, 10:42 صبح
کاربر که هرکاریش کنی دستی می فرسته، شما باید قسمت دریافت اطلاعات امنیتش رو بیشتر کنی
مثلا اگه v1 واژه عددی است از is_numeric استفاده کنی و اگه رشته است که از escape و ..

abbaszz
دوشنبه 23 بهمن 1391, 11:09 صبح
مرسی
سوال:
1. is_numeric رو کجا استفاده کنم؟ توی قسمت مقدار دهی به v1در php یا جی کیوری؟
2. با این روش v1 کدگذاری میشه؟ یا طور دیگه ای امنیت رو حفظ میکنه؟

siavashsay
دوشنبه 23 بهمن 1391, 11:34 صبح
بهتره از ctype_digit استفاده کنید ! بجای is_numeric
این تابع چک میکنه که متغیر شما یک عدد هست یا نه
مثال :

if(!ctype_digit($v1)){
echo "Error";
}else{
//do anything
}
موفق باشید

tehro0n
دوشنبه 23 بهمن 1391, 12:04 عصر
بهتره از ctype_digit استفاده کنید ! بجای is_numeric
این تابع چک میکنه که متغیر شما یک عدد هست یا نه
مثال :

if(!ctype_digit($v1)){
echo "Error";
}else{
//do anything
}
موفق باشید

اما به نظر من همان is_numeic تو این مثال بهتره..
زیرا که ctype_digit اگر عدد رو به صورت sting بفرسته تشخیص نمیده اما تابعی که من گفتم آن را نیز عدد قبول میکنه، اینجا مساله پست هستش و هر چیزی که عددی باشه باید عدد در نظر گرفته بشه، اعداد اعشاری رو هم ctype_digit به عنوان عدد نمیشناسه..

<?php

$numeric_string = '42';
$integer = 42;

ctype_digit($numeric_string); // true
ctype_digit($integer); // false (ASCII 42 is the * character)

is_numeric($numeric_string); // true
is_numeric($integer); // true
?>

ravand
دوشنبه 23 بهمن 1391, 12:05 عصر
من توی خیلی از سایت ها دیدم این ctype_digit رو پیشنهاد داده بودن.
برای چی is_numeric بهتر از ctype_digit هست؟ دلیلش چیه؟
متشکرم.

siavashsay
دوشنبه 23 بهمن 1391, 12:13 عصر
زیرا که ctype_digit اگر عدد رو به صورت sting بفرسته تشخیص نمیده اما تابعی که من گفتم آن را نیز عدد قبول میکنه، اینجا مساله پست هستش و هر چیزی که عددی باشه باید عدد در نظر گرفته بشه، اعداد اعشاری رو هم ctype_digit به عنوان عدد نمیشناسه..دوست عزیز !
اینجا برای چک کردن یک URL دارید بکار میبرید ! پس تابع ctype_digit براحتی کار میکنه !
اما تابع is_numeric اعداد منفی ( -1 ) اعداد اعشاری ( 1.09 ) رو هم قبول میکنه ! خوب اگر قرار باشه کاراکترهایی مثل منفی ( - ) و اعشار ( . ) داخل URL وارد شن دیگه فیلتر کردن به چه دردی میخوره ؟!
البته اگر اینکار برای محاسبات ریاضی میخواد کار بشه بهتره از همون is_numeric استفاده شه !
اما نمیودنم قضیه چیه که اگر محاسبات ریاضی هست چرا دار با GET کار میکنه ! اصلا صحیح نیست !:)

tehro0n
دوشنبه 23 بهمن 1391, 12:14 عصر
من توی خیلی از سایت ها دیدم این ctype_digit رو پیشنهاد داده بودن.
برای چی is_numeric بهتر از ctype_digit هست؟ دلیلش چیه؟
متشکرم.
یکی از دلایلش رو در پست بالایی گفتم این هم مثال برای اعداد اعشاری


$numeric_string = '42.5';
$integer = 42.5;

ctype_digit($numeric_string); // false
ctype_digit($integer); // false

is_numeric($numeric_string); // true
is_numeric($integer); // true

tehro0n
دوشنبه 23 بهمن 1391, 12:17 عصر
دوست عزیز !
اینجا برای چک کردن یک URL دارید بکار میبرید ! پس تابع ctype_digit براحتی کار میکنه !
اما تابع is_numeric اعداد منفی ( -1 ) اعداد اعشاری ( 1.09 ) رو هم قبول میکنه ! خوب اگر قرار باشه کاراکترهایی مثل منفی ( - ) و اعشار ( . ) داخل URL وارد شن دیگه فیلتر کردن به چه دردی میخوره ؟!

چه ربطی به url داره؟ اصلا این دوستمون سئوال نکردن که قراره چک کنه url درسته یا نه! پرسیدن مقادیر ارسالی get رو بررسی کنه!
برای url که کلا string و مقادیر subdomain domain http و غیره در نظر گرفته میشه!

abbaszz
دوشنبه 23 بهمن 1391, 13:28 عصر
منظورمو اشتباه رسوندم
من نمیخوام اگه کاربر بصورت دستی v1 رو در url وارد کرد do.php کار کنه( توضیحات بیشتر در پست اول (http://barnamenevis.org/showthread.php?383610-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-_GET&p=1698232&viewfull=1#post1698232))

AbiriAmir
دوشنبه 23 بهمن 1391, 19:03 عصر
نمیشه دوست عزیز!
خاصیت get همینه که از طریق url میشه بهش دسترسی داشت...
شما اطلاعات رو post کن
یا 1 پارامتر انکود شده رو هم همراش بفرست که کاربر الگوریتم تولید اون پارامتر رو ندونه...

FastCode
دوشنبه 23 بهمن 1391, 20:48 عصر
نمیشه دوست عزیز!
خاصیت get همینه که از طریق url میشه بهش دسترسی داشت...
شما اطلاعات رو post کن
یا 1 پارامتر انکود شده رو هم همراش بفرست که کاربر الگوریتم تولید اون پارامتر رو ندونه...
من که وب کار نکردم میفهمم روش غلطه
چطور میشه الگورینم تولید کد رو سمت کلاینت پنهان کرد؟





سعی کن از Guid یا یک رشته تصادفی مثلyoutube استفاده کنی

SlowCode
سه شنبه 24 بهمن 1391, 00:11 صبح
من که وب کار نکردم میفهمم روش غلطه
چطور میشه الگورینم تولید کد رو سمت کلاینت پنهان کرد؟
سلام
php در این مورد با زبان های سیستمی خیلی فرق میکنه. دستورات php رو سرور اجرا میشن و خروجیشون html هست و الگوریتم ما هیچ وقت لو نمیره.

سعی کن از Guid یا یک رشته تصادفی مثلyoutube استفاده کنی
حرف ایشون هم تقریبا همین بود:چشمک:

FastCode
سه شنبه 24 بهمن 1391, 00:29 صبح
سلام
php در این مورد با زبان های سیستمی خیلی فرق میکنه. دستورات php رو سرور اجرا میشن و خروجیشون html هست و الگوریتم ما هیچ وقت لو نمیره.

حرف ایشون هم تقریبا همین بود:چشمک:
اینقدر php بلد هستم که این رو بفهمم.
وقتی میگه POST کن و یک پارامتر encode شده هم همراهش بفرست یعنی سمت کلاینت پارامتر رو ایجاد کن.



بهترین نمونه برای کاری که شما میخوهید انجام بدید سایت های manga هستن.(که البته یک مقدار با قوانین ...)
mangareader(چند تا ورژن مختلف داره که ممکنه بین chapterهای یک manga تغییر کنه/اون ورژنی که ۳ تا پارامتر concat شده با "-" داره از همه جالب تره)
mangafox
mangame
من هنوز دقت نکردم ببینم چطوری url ها رو میفرستن یا کنترل میکنن.ولی بعضیهاون روشهای جالبی بروی جلوگیری از autogenerate کردن دارن

abbaszz
سه شنبه 24 بهمن 1391, 00:45 صبح
مرسی از راهنمایی بچه ها.
ساده ترین راه :
از کدگذاری استفاده کنم امنیتش در چه حده ؟
در ارسال از base64_encode
و در دریافت از base64_decode استفاده کنم

FastCode
سه شنبه 24 بهمن 1391, 00:58 صبح
مرسی از راهنمایی بچه ها.
ساده ترین راه :
از کدگذاری استفاده کنم امنیتش در چه حده ؟
در ارسال از base64_encode
و در دریافت از base64_decode استفاده کنم
معمولاً کسی وقت نمیزاره ببینه چی به چیه.
۹۰٪ که از قبل نمیفهمیدن URL چیه.
از اون ۱۰٪ هم ۹۹٪ بی خیال میشن.
جالا اگر مشکلت اون یک دهم درصد ه.باید بگم base64 کمه.
حداقل از یه چیز دیگه استفاده کن که همه نشناسنش مثل rot13.

abbaszz
سه شنبه 24 بهمن 1391, 13:15 عصر
rot13 مشکلش اینکه دیکد نمیشه
اوکی مرسی از همه

AbiriAmir
سه شنبه 24 بهمن 1391, 13:31 عصر
من که وب کار نکردم میفهمم روش غلطه
چطور میشه الگورینم تولید کد رو سمت کلاینت پنهان کرد؟





سعی کن از Guid یا یک رشته تصادفی مثلyoutube استفاده کنی

دوست عزیز چرا حرف تو دهن من میذاری؟!
من گفتم سمت کلاینت رمز تولید کنن؟!
خوب سمت سرور تولید میکنید و میذارید توی 1 سشن و بعد چکش میکنید و سابمیت که شد هم اون سشن رو پاک میکنید یا تغییر میدید... (1 چیزی تو مایه های Captcha)

FastCode
سه شنبه 24 بهمن 1391, 14:05 عصر
دوست عزیز چرا حرف تو دهن من میذاری؟!
من گفتم سمت کلاینت رمز تولید کنن؟!
خوب سمت سرور تولید میکنید و میذارید توی 1 سشن و بعد چکش میکنید و سابمیت که شد هم اون سشن رو پاک میکنید یا تغییر میدید... (1 چیزی تو مایه های Captcha)
این یکی کاملاً منطقیه.

rot13 مشکلش اینکه دیکد نمیشه
برای نمونه میتونید PHProxy/poxy Copyright 2005 ultimategamer00 (Abdullah A.) رو ببینید

رضا قربانی
چهارشنبه 25 بهمن 1391, 02:15 صبح
من الان ctype_digit رو تست کردم وقتی تعداد رقم ها کم و زیاد میشه نتیجه خروجی فرق می کنه !!! عجب ، کسی می دونه جریان چیه؟

tehro0n
چهارشنبه 25 بهمن 1391, 12:48 عصر
من الان ctype_digit رو تست کردم وقتی تعداد رقم ها کم و زیاد میشه نتیجه خروجی فرق می کنه !!! عجب ، کسی می دونه جریان چیه؟

کدی که نوشتی رو بذار ببینم چه اعدادی زدی و چطور نوشتی
چون اگه به صورت کاراکتر نذاری اعداد کوچیک رو به صورت اسکی میشناسه

pdvlx10
دوشنبه 30 بهمن 1391, 08:15 صبح
rot13 مشکلش اینکه دیکد نمیشه
اوکی مرسی از همه

سلام
کی گفته rot13 دیکد نمیشه؟!:اشتباه: