Train

PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آیا این تابع یه تابع کامل برای مقابله انواع sql injection هست؟


phpweb
08-27-2011, 05:15 PM
این تابع رو خودم نوشتم، لطفا بگید که آیا این تابع یه تابع کامل برای مقابله انواع sql injection هست؟

توی این تابع:
1- ابتدا توسط get_magic_quotes_gpc و stripslashes قابلیت اسکیپ اتوماتیک خنثی می شه.
2- به کمک trim کاراکترهای اضافه از ابتدا و انتهای مقادیر حذف می شن.
3- به کمک htmlentities جلوی انواع روشهای xss گرفته می شه.
4- به کمکstr_replace کاراکترهای مخرب اسکیپ می شن.
5- به کمک mysql_real_escape_string کاراکترهایی که از نظر دیتابیس مخرب هستن اسکیپ می شن.

به نظر خودم این تابع کاملا ایمن هست ولی لطفا از این تابع که نوشتم ایراد بگیرید.



function sql_injection($str)
{
if(get_magic_quotes_gpc()) {$str=stripslashes($str);}
$arr[]='`';
//$arr[]='~';
$arr[]='!';
$arr[]='#';
$arr[]='$';
$arr[]='%';
//$arr[]='^';
$arr[]='*';
$arr[]='(';
$arr[]=')';
$arr[]='-';
$arr[]='=';
//$arr[]='+';
//$arr[]='{';
//$arr[]='}';
//$arr[]='[';
//$arr[]=']';
$arr[]=',';
$arr[]='.';
$arr[]='?';
$arr[]='/';
//$arr[]='|';
$arr[]='\x';

$newarr[]='\`';
//$newarr[]='\~';
$newarr[]='\!';
$newarr[]='\#';
$newarr[]='\$';
$newarr[]='\%';
//$newarr[]='\^';
$newarr[]='\*';
$newarr[]='\(';
$newarr[]='\)';
$newarr[]='\-';
$newarr[]='\=';
//$newarr[]='\+';
//$newarr[]='\{';
//$newarr[]='\}';
//$newarr[]='\[';
//$newarr[]='\]';
$newarr[]='\,';
$newarr[]='\.';
$newarr[]='\?';
$newarr[]='\/';
//$newarr[]='\|';
$newarr[]='\\x';

$tstr=trim($str);
$estr=htmlentities($tstr, ENT_QUOTES,'UTF-8');
$mstr = str_replace($arr, $newarr, $estr);
return mysql_real_escape_string($mstr);
}

M.R.S.CO
08-27-2011, 05:28 PM
:کد زير را در نظر داشته باشيد
کد PHP:
<?php $q="select * from TABLE where id=".$_GET['id']; $q1=mysql_query($q); ?>
:روشهای معمول ايمن سازی به صورت زير است
استفاده از تابع int:
:کد اصلاح شده با اين متد
کد PHP:
<?php $id=(int)$_GET['id']; $q="select * from TABLE where id='".$id."'"; $q1=mysql_query($q); ?>
اعتبار سنجی ورودی به وسيله تابع
که تقريبا کار بالا رو انجام ميده: ctype_digit()
کد اصلاح شده با اين متد
:
کد PHP:
<?php $id=$_GET['id']; if(isset($id) AND ctype_digit($id)){ $q="select * from TABLE where id='".$id."'"; $q1=mysql_query($q); } ?>
استفاده از
Escape
:کد اصلاح شده با اين متد
کد PHP:
<?php $id=$_GET['id']; $q="select * from TABLE where id='".mysql_real_escape_string($id)."'"; $q1=mysql_query($q); ?>
!اين کد تمامی ورودی های مضر را خنثی می کنه
متد escape
:روش های ديگه هم داره که خيلی ايمن نيستند اما من بخاطر اينکه کتاب جامع هست آنها را می آورم
استفاده از تابع addslash , str_replace:
کد PHP:
<?php $id=$_GET['id']; $q="select * from TABLE where id='".addslashes($id)."'"; $q1=mysql_query($q); ?>
...اين روش يک / به کد ورودی اضفه می کنه
و برای str_replace:
کد PHP:
<?php $id=$_GET['id'];
$q="select * from TABLE where id='".str_replace("'","''",$id)."'"; $q1=mysql_query($q); ?>
همانطور که می دانيد اين يک تابع تبديل هست و آرگومنت اول را به آرگومنت دوم تبديل می کنه...

phpweb
08-27-2011, 05:45 PM
:کد زير را در نظر داشته باشيد
کد php:
<?php $q="select * from table where id=".$_get['id']; $q1=mysql_query($q); ?>
:روشهای معمول ايمن سازی به صورت زير است
استفاده از تابع int:
:کد اصلاح شده با اين متد
کد php:
<?php $id=(int)$_get['id']; $q="select * from table where id='".$id."'"; $q1=mysql_query($q); ?>
اعتبار سنجی ورودی به وسيله تابع
که تقريبا کار بالا رو انجام ميده: Ctype_digit()
کد اصلاح شده با اين متد
:
کد php:
<?php $id=$_get['id']; if(isset($id) and ctype_digit($id)){ $q="select * from table where id='".$id."'"; $q1=mysql_query($q); } ?>
استفاده از
escape
:کد اصلاح شده با اين متد
کد php:
<?php $id=$_get['id']; $q="select * from table where id='".mysql_real_escape_string($id)."'"; $q1=mysql_query($q); ?>
!اين کد تمامی ورودی های مضر را خنثی می کنه
متد escape
:روش های ديگه هم داره که خيلی ايمن نيستند اما من بخاطر اينکه کتاب جامع هست آنها را می آورم
استفاده از تابع addslash , str_replace:
کد php:
<?php $id=$_get['id']; $q="select * from table where id='".addslashes($id)."'"; $q1=mysql_query($q); ?>
...اين روش يک / به کد ورودی اضفه می کنه
و برای str_replace:
کد php:
<?php $id=$_get['id'];
$q="select * from table where id='".str_replace("'","''",$id)."'"; $q1=mysql_query($q); ?>
همانطور که می دانيد اين يک تابع تبديل هست و آرگومنت اول را به آرگومنت دوم تبديل می کنه...
لطفا کدهای پی اچ پی رو توی بلاک خودشون قرار بدید تا خواناتر بشن.

من انواع روشهای هک رو خوندم. لطفا از تابعی که نوشتم ایراد بگیرید.

NightC0der
08-27-2011, 06:37 PM
این تابع رو خودم نوشتم، لطفا بگید که آیا این تابع یه تابع کامل برای مقابله انواع sql injection هست؟

توی این تابع:
1- ابتدا توسط get_magic_quotes_gpc و stripslashes قابلیت اسکیپ اتوماتیک خنثی می شه.
2- به کمک trim کاراکترهای اضافه از ابتدا و انتهای مقادیر حذف می شن.
3- به کمک htmlentities جلوی انواع روشهای xss گرفته می شه.
4- به کمکstr_replace کاراکترهای مخرب اسکیپ می شن.
5- به کمک mysql_real_escape_string کاراکترهایی که از نظر دیتابیس مخرب هستن اسکیپ می شن.

به نظر خودم این تابع کاملا ایمن هست ولی لطفا از این تابع که نوشتم ایراد بگیرید.



function sql_injection($str)
{
if(get_magic_quotes_gpc()) {$str=stripslashes($str);}
$arr[]='`';
//$arr[]='~';
$arr[]='!';
$arr[]='#';
$arr[]='$';
$arr[]='%';
//$arr[]='^';
$arr[]='*';
$arr[]='(';
$arr[]=')';
$arr[]='-';
$arr[]='=';
//$arr[]='+';
//$arr[]='{';
//$arr[]='}';
//$arr[]='[';
//$arr[]=']';
$arr[]=',';
$arr[]='.';
$arr[]='?';
$arr[]='/';
//$arr[]='|';
$arr[]='\x';

$newarr[]='\`';
//$newarr[]='\~';
$newarr[]='\!';
$newarr[]='\#';
$newarr[]='\$';
$newarr[]='\%';
//$newarr[]='\^';
$newarr[]='\*';
$newarr[]='\(';
$newarr[]='\)';
$newarr[]='\-';
$newarr[]='\=';
//$newarr[]='\+';
//$newarr[]='\{';
//$newarr[]='\}';
//$newarr[]='\[';
//$newarr[]='\]';
$newarr[]='\,';
$newarr[]='\.';
$newarr[]='\?';
$newarr[]='\/';
//$newarr[]='\|';
$newarr[]='\\x';

$tstr=trim($str);
$estr=htmlentities($tstr, ENT_QUOTES,'UTF-8');
$mstr = str_replace($arr, $newarr, $estr);
return mysql_real_escape_string($mstr);
}



اشكالش اينه كه دست و پاي خودتو بستي ...
اگه بخواي يه string كه question mark داره رو تو ديتابيس ذخيره كني "؟" رو حذف مي كنه ! واسه گرفتن str خيلي مشكلات ايجاد مي كنه ! ( ديگه مطمئنن نمي توني search engine مناسب واسه سايتت بنويسي ! چون "-+)( qoutes" اسكيپ ميشه ! )

از PDO استفاده كن با خيال راحت كد بنويس ! جلوي SQLI و XSRF روميگيره ... پرتالت هم با mysql ميتونه بياد بالا هم mssql , access , oracle , ...

موفق باشيد

alir77
08-27-2011, 07:25 PM
منم میخواستم بگم PDO که دیدم NightC0der گفته.

با pdo شما هیچ تغییری نمیدی و صاف همینی که هست رو میفرستی داخل بانک با چشم بسته و با خیال راحت.

entitle کردن برای جلوگیری از xss هم راه حل جامعی نیست. توصیه میشه از کلاس htmlpurify استفاده کنی.

phpweb
08-27-2011, 07:30 PM
اشكالش اينه كه دست و پاي خودتو بستي ...
اگه بخواي يه string كه question mark داره رو تو ديتابيس ذخيره كني "؟" رو حذف مي كنه ! واسه گرفتن str خيلي مشكلات ايجاد مي كنه ! ( ديگه مطمئنن نمي توني search engine مناسب واسه سايتت بنويسي ! چون "-+)( qoutes" اسكيپ ميشه ! )

از PDO استفاده كن با خيال راحت كد بنويس ! جلوي SQLI و XSRF روميگيره ... پرتالت هم با mysql ميتونه بياد بالا هم mssql , access , oracle , ...

موفق باشيد

توی این تابع که نوشتم هیچ کاراکتری حذف نمی شه. کاراکتر ؟ به /؟ تبدیل می شه.
از اونجاییکه برای اسکیپ کردن از mysql_real_escape_string استفاده می کنم، این تابع کوتیشنها رو بدون اضافه کردن بک اسلش خنثی می کنه.

اگر هم قرار بشه که سرچ انجن بنویسم، می دونم چه کاراکترهایی تبدیل شدن و سرچ انجن رو بر این اساس می نویسم.

لطفا نظرتون رو بگید.

البته در مورد PDO هم شما درست می گید و کلا بهتره از PDO استفاده کنم. اما در خال حاضر از توابع دستساز خودم استفاده می کنم.

phpweb
08-27-2011, 07:39 PM
منم میخواستم بگم PDO که دیدم NightC0der گفته.

با pdo شما هیچ تغییری نمیدی و صاف همینی که هست رو میفرستی داخل بانک با چشم بسته و با خیال راحت.

entitle کردن برای جلوگیری از xss هم راه حل جامعی نیست. توصیه میشه از کلاس htmlpurify استفاده کنی.

یعنی توی pdo هیچ تغییری توی داده ها ایجاد نمی شه؟ اگر اینطوریه که بهتره کلا از pdo استفاده کنم.

لطفا در مورد htmlpurify کمی توضیح بدید.