sql injection

معني و مفهوم كد زير چيه؟ آيا مي شه ورودي ها رو با تابع زير فيلتر كنيم منظورم اينه كه اين تابع براي جلوگيري از sqlinjection كافيه؟

کد:
function Safe_SQL($Str_Input)
{

    if(get_magic_quotes_gpc()): function_exists('mysql_real_escape_string') ? stripslashes(mysql_real_escape_string(&$Str_Input)) : stripslashes(mysql_escape_string(&$Str_Input));
    else: function_exists('mysql_real_escape_string') ? addslashes(mysql_real_escape_string(&$Str_Input)) : addslashes(mysql_escape_string(&$Str_Input));
    endif;

    return($Str_Input);
}
 

P.H.P

Member
سلام

بله میتونید از این کد برای فیلتر کردن ورودی ها و جلوگیری از sql injection استفاده کنید

موفق
 
سلام

بله میتونید از این کد برای فیلتر کردن ورودی ها و جلوگیری از sql injection استفاده کنید

موفق

مفهوم اين كد چيه مثلا يه قسمتش مي گه
کد:
 [COLOR=#0000BB]addslashes[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]mysql_real_escape_string[/COLOR][COLOR=#007700](&[/COLOR][COLOR=#0000BB]$Str_Input[/COLOR][COLOR=#007700]))[/COLOR]
اين يعني چي؟ يه بار مي آد با mysql_real_escape_string يه \ اضافه مي كنه و بعدش مي آد با addslashes يه \ ديگه اضافه مي كنه، چرا؟
 

P.H.P

Member
addslashes که از اسمش مشخصه

نمونه
PHP:
<?php
$str = "this ' is ' my ' code";
echo addslashes($str);
?>

خروجی میشه
کد:
this \' is \' my \' code

mysql_real_escape_string هم میاد رشته های صحیح رو وارد یا اصلاح میکنه

نمونه
PHP:
<?php
echo mysql_real_escape_string("' or '1'");
?>

خروجی میشه
کد:
\' or \'1\'

موفق
 
کد:
 [COLOR=#0000bb]addslashes[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]mysql_real_escape_string[/COLOR][COLOR=#007700](&[/COLOR][COLOR=#0000bb]$Str_Input[/COLOR][COLOR=#007700]))[/COLOR]
این میشه دو تا Slash کنار هم که یعنی هیچی، انگار هیچ Slashای وجود نداره. در عمل یعنی ما متن رو از escape خارج کردیم. اين مه غلط مي شه، نمي شه؟
 

P.H.P

Member
متوجه منظورت نشدم، میخوای حذف کنی؟

برای حذف slash میتونی از تابع stripslashes استفاده کنی

PHP:
<?php
echo stripslashes("\' or \'1\'");
?>
 

P.H.P

Member
آهان 2 بار slash میزنه؟

خوب mysql escape کافیه

از این تابع استفاده کن
PHP:
<?php
function scapeString($string)
{
    $string = trim($string);

    if(get_magic_quotes_gpc())
        $string = stripslashes($string);

    if(function_exists("mysql_real_escape_string"))
        $string = mysql_real_escape_string($string);
    else
    {
        $string = addslashes($string);

        $string = str_replace("_", "\_", $string);
        $string = str_replace("%", "\%", $string);
    }

    return $string;
}
?>
 
ممنون از شما (P.H.P) بابت پاسخي كه داديد و تابعي كه گذاشتيد.
ولي يه سوال، تابع زير كه من خيلي جاها ديدم براي من مفهوم نيست، براي شما چطور؟

کد:
function Safe_SQL($Str_Input)
{

    if(get_magic_quotes_gpc()): function_exists('mysql_real_escape_string') ? stripslashes(mysql_real_escape_string(&$Str_Input)) : stripslashes(mysql_escape_string(&$Str_Input));
    else: function_exists('mysql_real_escape_string') ? addslashes(mysql_real_escape_string(&$Str_Input)) : addslashes(mysql_escape_string(&$Str_Input));
    endif;

    return($Str_Input);
}
 

P.H.P

Member
چرا مفهوم نیست؟

این تابع رو از حالت ternry خارج کنی بهتر متوجه میشی

PHP:
function Safe_SQL($Str_Input)
{
    if(get_magic_quotes_gpc())
    {
        if(function_exists('mysql_real_escape_string'))
            stripslashes(mysql_real_escape_string(&$Str_Input)) 
        else
            stripslashes(mysql_escape_string(&$Str_Input));
    }
    else
    {
        if(function_exists('mysql_real_escape_string'))
            addslashes(mysql_real_escape_string(&$Str_Input))
        else
            addslashes(mysql_escape_string(&$Str_Input));
    }

    return($Str_Input);
}
 
چرا مفهوم نیست؟

این تابع رو از حالت ternry خارج کنی بهتر متوجه میشی

PHP:
function Safe_SQL($Str_Input)
{
    if(get_magic_quotes_gpc())
    {
        if(function_exists('mysql_real_escape_string'))
            stripslashes(mysql_real_escape_string(&$Str_Input)) 
        else
            stripslashes(mysql_escape_string(&$Str_Input));
    }
    else
    {
        if(function_exists('mysql_real_escape_string'))
            addslashes(mysql_real_escape_string(&$Str_Input))
        else
            addslashes(mysql_escape_string(&$Str_Input));
    }

    return($Str_Input);
}

منظورم از مفهوم نبودن، عملكرد تابع بود، پست هاي قبلي هم گفتم، من با اين قسمتش مشكل دارم
کد:
[COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]addslashes[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]mysql_real_escape_string[/COLOR][COLOR=#007700](&[/COLOR][COLOR=#0000BB]$Str_Input[/COLOR][COLOR=#007700]))[/COLOR][/COLOR]
آخه مي آد دو تا \ اضافه مي كنه و كلا عمل escape كردنو خنثي مي كنه، درسته؟
 

P.H.P

Member
خوب کسی که اینو نوشته حتما دلیل خواصی داشته و برای کار خواصی ازش استفاده میکنه

ولی شما اول باید چک کنی ببینی get_magic_quotes_gpc فعال است یا خیر

اگر بود stripslashes میکنی (حذف Slash)

و بعد اگر تابع mysql_real_escape_string فعال بود ازش استفاده میکنی در غیر این صورت از addslashes استفاده کن

در واقع mysql_real_escape_string کافیه

شما اگر به mysql متصل نباشی نمیتونی از mysql_real_escape_string استفاده کنی در نتیجه باید از addslashes استفاده کنی (مواقعی که نیاز دیتابیس نداشته باشی و بخوای ورودی ها رو filter کنی)

از همون تابعی که دادم استفاده کن

موفق
 
ممنون از سعه صدر شما و وقتي كه مي زاريد.

توضيحتون كامل بود. ممنون. ولي بيايم يه كم رو تابع شما كار كنيم.
اول بگيد چرا اين دو كاراكتر؟ دليل؟
کد:
[COLOR=#000000][COLOR=#0000bb]$string [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]str_replace[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"_"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#dd0000]"\_"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]$string[/COLOR][COLOR=#007700]);
        [/COLOR][COLOR=#0000bb]$string [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]str_replace[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"%"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#dd0000]"\%"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]$string[/COLOR][COLOR=#007700]);
[/COLOR][/COLOR]
من فكر مي كنم اين كاراكترها بايد اضافه بشه، يعني بايد null بشه.
کد:
$string = str_replace("--","",$string);
$string = str_replace("union","",$string);
$string = str_replace("union select","",$string);
$string = str_replace("union+select","",$string);
$string = str_replace("concat","",$string);
$string = str_replace("user()","",$string);
$string = str_replace("current_user()","",$string);
$string = str_replace("database()","",$string);
$string = str_replace("version()","",$string);
$string = str_replace("alter table","",$string);
$string = str_replace("alter+table","",$string);
$string = str_replace("drop table","",$string);   
$string = str_replace("drop+table","",$string);   
$string = str_replace("drop","",$string);

$string = str_replace("load_file()","",$string);
$string = str_replace("hex()","",$string);
$string = str_replace("unhex()","",$string);
$string = str_replace("char()","",$string);
$string = str_replace("group_concat()","",$string);
ممنون مي شم نظر بدين، اگه نظرتون مثبت هست، تابع رو از اول كامل كنيد بزاريم اين جا همه استفاده كنند.
 
آخرین ویرایش:

P.H.P

Member
برای _ و % باید بگم که در استفاده از query میتونه مشکل ساز باشه

شما اگر بخوای جستجو بین کلمه ها انجام بدی از چه Qeury استفاده میکنی؟
کد:
SELECT * FROM table WHERE field LIKE '%$var%'

برای جستجوی دقیق تر از % استفاده میکنیم

حالا فکر کن اگر توی ورودی ها از % استفاده بشه میتونه query رو با مشکل مواجه کنه

برای underline هم به همین صورت هست

برای جایگزین پارامترهایی که شما گفتید امکانش هست ولی اگر query رو با دستورات صحیح و filter ایجاد کنی نیازی نیست

شاید کلمه union بین عناوین سایتتون باشه یا هر چیز دیگه

به جای اینکار میتونی از ورودی های url جلوگیری کنی با این تابع

PHP:
function _Inject_($str)
{
    if(eregi("select|insert|update|delete|\/'|\/\*|\*|\.\.\/|\.\/|\-|\,|union|into|load_file|outfile|order|by|from|group_concat", $str))
        return false;

    return true;
}

موفق
 
به جای اینکار میتونی از ورودی های url جلوگیری کنی با این تابع

PHP:
function _inject_($str)
{
    if(eregi("select|insert|update|delete|\/'|\/\*|\*|\.\.\/|\.\/|\-|\,|union|into|load_file|outfile|order|by|from|group_concat", $str))
        return false;

    return true;
}
موفق

نفهميدم، اين تابعو كجا بايد به كار ببريم؟
 

P.H.P

Member
میتونی get هم استفاده کنه

برای هر چیزی میتونه قابل استفاده باشه
 

جدیدترین ارسال ها

بالا