PDA

View Full Version : سوال: امنیت در pdo



trasilver
شنبه 23 فروردین 1393, 00:12 صبح
سلام و عرض ادب خدمت عزیزان.

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

دوستان عزیز می خواستم ببینم کد زیر امنیتش چند درصد می تونه باشه؟ ایا باگ injection می خوره؟


public function getRow($query, $params=array()){
try{
$stmt = $this->datab->prepare($query);
$stmt->execute($params);
return $stmt->fetch();
}catch(PDOException $e){
throw new Exception($e->getMessage());
}
}

این قسمت از یک تابع در همون کلاس می خوایم کوئری رو فراخوانی کنیم.


$q = 'SELECT * FROM tabale WHERE `id` = ?';
$result = $this->getRow($q, array($_GET['id']));

بازم معذرت سوال.

و اگه روش بهتری برای نوشتن این کد سراغ دارید بفرمایید. فقط بقیه کلاس رو نذاشتم.

trasilver
شنبه 23 فروردین 1393, 23:44 عصر
سلامی مجدد خدمت عزیزان.
کسی از دوستان نظری نداشت؟

tux-world
یک شنبه 24 فروردین 1393, 00:17 صبح
توی همون تاپیک ها جواب دادن بهتون . شما باید ورودی ها رو scape کنید
یعنی اینکه پاکسازی بکنید یه سری چیزهایی ممکنه فرستاده شده باشه. مثلا با اینها:


$username = mysql_real_escape_string($_POST['username']);

$user = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');

function clean_string( $value, $DB )
{
if ( get_magic_quotes_gpc() )
{
$value = stripslashes( $value );
}
// escape things properly
return mysql_real_escape_string( $value, $DB );
}

trasilver
یک شنبه 24 فروردین 1393, 01:05 صبح
توی همون تاپیک ها جواب دادن بهتون . شما باید ورودی ها رو scape کنید
یعنی اینکه پاکسازی بکنید یه سری چیزهایی ممکنه فرستاده شده باشه. مثلا با اینها:


$username = mysql_real_escape_string($_POST['username']);

$user = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');

function clean_string( $value, $DB )
{
if ( get_magic_quotes_gpc() )
{
$value = stripslashes( $value );
}
// escape things properly
return mysql_real_escape_string( $value, $DB );
}
ممنون ولی pdo چه ربطی به mysql داشت؟ :متعجب::متفکر:

SadeghPro19
یک شنبه 24 فروردین 1393, 02:29 صبح
تابعی که نوشتین مشکلی نداره از لحاظ Sql Injection چون خوده PDO اصلا یکی از اهدافش برطرف کردن همین باگ Sql Injection هست پس مشکلی نیست. برای استفاده از یه کلاس عالی کار با دیتابیس و مبتنی بر PDO پیشنهاد میکنم یه نگاهی به Medoo.in بندازین.

masiha68
یک شنبه 24 فروردین 1393, 10:07 صبح
ممنون ولی pdo چه ربطی به mysql داشت؟ :متعجب::متفکر:
پی دی او یه کلاسه کار با mysql هستش ... که از سایر دیتابیس ها هم پشتیبانی می کنه
در مورد sql injection هم که خود پی دی او داده ها رو امن می کنه و نیازی به امن سازی نیست ولی شما همیشه محتاط باشید و جاهایی خطرناک داده ها رو امن کنین

trasilver
یک شنبه 24 فروردین 1393, 13:46 عصر
پی دی او یه کلاسه کار با mysql هستش ... که از سایر دیتابیس ها هم پشتیبانی می کنه
در مورد sql injection هم که خود پی دی او داده ها رو امن می کنه و نیازی به امن سازی نیست ولی شما همیشه محتاط باشید و جاهایی خطرناک داده ها رو امن کنین
ممنون بابت توضیحات دوستان.
بله می دونم pdo چی هست و چه کاره هستش. اما من بالا نوشتم دوستان این کد pdo که من نوشتم آیا در برابر sql injection امن هست دوست عزیزمون tux-world برداشتند کد mysql نوشتند :لبخند: به همین دلیل تعجب کردم که در استفاده pdo دیگه mysql چیست که ایشون کد گذاشتند :لبخند:

Unique
یک شنبه 24 فروردین 1393, 14:45 عصر
خیلی بحث شده و حتما جستجوی شما درست یا کامل نبوده !
وقتی از parametrized query ها و prepared statement ها استفاده میکنید کلا ورودی ها فقط مقدار هستند و evaluate نمیشوند ! پس کلا sql injection بی اثر میشه روی اونها ! هم توی pdo و هم mysqli اگه prepared کنید و parameter بدین مثل مثالی که زدین هیچ مشکلی در زمینه sql injection نخواهید داشت ولی ممکنه با ذخیره html و نمایش اون xss مشکل ساز بشه ! برای رفع xss هم خیلی صحبت شده که میتونید جستجو کنید.

navid3d_69
دوشنبه 25 فروردین 1393, 01:22 صبح
آموزش توی بخش امنیت درباره امنیت PDO و کلا آموزش و روش sql injection رو گذاشتم

این هم لینک آموزش از منبع

http://www.blog.sedehi.ir/php/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%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%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-sql-injection/

trasilver
دوشنبه 25 فروردین 1393, 12:48 عصر
با تشکر از شما.

از مدیر بخش تقاضا دارم که این موضوع را مهم(اعلان) کنند چرا که شاید سوال خیلی از دوستان باشد و از تاپیک های تکراری جلوگیری خواهد کرد.

با تشکر.