تالار گفتمان nCIS.ir

نسخه‌ی کامل: آیا این تابع برای sql injection خوبه
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام و عرض ادب و احترام 
حال شما 
خوب هستین 
به این کد من یه نگاه بندازین .
این کد عمل Insert رو با pdo انجام میده .
من خونده بودم که اگه از pdo استفاده کنم . جلوی حملات sql injection گرفته میشه .
آیا من تو کد زیر تونستم این کار رو به خوبی انجام بدم ؟
به نظرتون کدم مشکلی داره ؟

public function insert($table,$data){

   $this->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);

ksort($data);

$keyfild='`'.implode('`,`',array_keys($data)).'`';

$valfild=':'.implode(',:',array_keys($data));

$res=$this->prepare("INSERT INTO `$table` ($keyfild) VALUES ($valfild)");



foreach($data as $key=>$val){

$res->bindValue(":$key",$val);

}

$rr=$res->execute();

if($rr){

session::set('insert',true_matn); 

}else{

session::set('insert',false_matn);

   }
}
بله این مشکل sql injection نداره. ولی به جای اینکه خودتون کد دسترسی به دیتـابیس بنویسید و بهش شک داشته باشید ازGithub.com کتابخونه های آماده دسترسی به دیتابیس دانلود کنید
باید برای مقادیر از array_values استفاده کنید. ضمناً یکم مرتب‌تر بنویسید و سعی‌کنید ثابت‌ها رو با حروف بزرگ بنویسید (یه‌جور قرارداد نانوشته است بین برنامه‌نویس‌ها) Ywink

public function insert($table, $data)
{
    $this->setAttribute(pdo::ATTR_EMULATE_PREPARES, false);
    ksort($data);
    $keyField = '`' . implode('`,`', array_keys($data)) . '`';
    $valField = ':' . implode(',:', array_values($data));
    $res = $this->prepare("INSERT INTO `{$table}` ({$keyField}) VALUES ({$valField});");
    foreach($data as $key => $val) {
        $res->bindValue(":{$key}", $val);
    }
    session::set('insert', $res->execute() ? TRUE_MESSAGE : FALSE_MESSAGE); 
}