• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
یک تابع ساده برای جلوگیری از SQLi
#1
کد پی‌اچ‌پی:
<?PHP
    
FUNCTION anti_injection$user$pass ) {
           
// We'll first get rid of any special characters using a simple regex statement.
           // After that, we'll get rid of any SQL command words using a string replacment.
            
$banlist = ARRAY (
                    
"insert""select""update""delete""distinct""having""truncate""replace",
                    
"handler""like"" as ""or ""procedure""limit""order by""group by""asc""desc"
            
);
            
// ---------------------------------------------
            
IF ( EREGI "[a-zA-Z0-9]+"$user ) ) {
                    
$user TRIM STR_REPLACE $banlist''STRTOLOWER $user ) ) );
            } ELSE {
                    
$user NULL;
            }
            
// ---------------------------------------------
            // Now to make sure the given password is an alphanumerical string
            // devoid of any special characters. strtolower() is being used
            // because unfortunately, str_ireplace() only works with PHP5.
            
IF ( EREGI "[a-zA-Z0-9]+"$pass ) ) {
                    
$pass TRIM STR_REPLACE $banlist''STRTOLOWER $pass ) ) );
            } ELSE {
                    
$pass NULL;
            }
            
// ---------------------------------------------
            // Now to make an array so we can dump these variables into the SQL query.
            // If either user or pass is NULL (because of inclusion of illegal characters),
            // the whole script will stop dead in its tracks.
            
$array = ARRAY ( 'user' => $user'pass' => $pass );
            
// ---------------------------------------------
            
IF ( IN_ARRAY NULL$array ) ) {
                    DIE ( 
'Invalid use of login and/or password. Please use a normal method.' );
            } ELSE {
                    RETURN 
$array;
            }
    }
?>
  پاسخ
تشکر شده توسط :
#2
از من میپرسی، این قبیل توابع هیچ ضرورتی ندارن و کاملا ناشیانه هستند. این خودش استفاده از Black list هست که Black list هم اغلب روش ضعیف و متزلزلی هست. مثلا فرض کن شاید از یک DBMS دیگه/متفاوت استفاده شد که کلمات کلیدی مختص خودش رو داشت.
شاید فردا یک اکستنشن و کیورد جدیدی به همین MySQL اضافه شد.

طراجی اینطور چیزها به معنی اینه که تا دو قدمی جلوی پا رو بیشتر نمیبینیم و صرفا ظاهر و نمودهای چیزی رو دیده و ازش میترسیم و مکانیزم اصلی و راهکارهای اصولی رو درک نکردیم، و بنابراین صرفا دست به حذف دونه به دونهء اون نمودها میزنیم.

متدهای استانداردی مثل mysql_real_escape_string چه مشکلی دارن مگه؟ هیچ فکرش رو کردید؟
  پاسخ
تشکر شده توسط : cyletech
#3
نقل قول:متدهای استانداردی مثل mysql_real_escape_string چه مشکلی دارن مگه؟ هیچ فکرش رو کردید؟

آره میدونم عزیزم .. در PDO هم چنین چیزی واسه فیلتر کردن ورودی ها هست اما این تابعی که توو پست اولی اشاره شد فقط واسه کار راه اندازی و سریع پیش بردن کارهاست !
  پاسخ
تشکر شده توسط :
#4
mysql_real_escape_string که کار راه بنداز تر و راحتتر و مطمئن تره که
  پاسخ
تشکر شده توسط :
#5
(۱۳۹۱ خرداد ۲۵, ۱۲:۳۵ ب.ظ)Mr.M4st3r نوشته: آره میدونم عزیزم .. در PDO هم چنین چیزی واسه فیلتر کردن ورودی ها هست اما این تابعی که توو پست اولی اشاره شد فقط واسه کار راه اندازی و سریع پیش بردن کارهاست !
lol
یعنی چی Big Grin
  پاسخ
تشکر شده توسط :
#6
نقل قول:lol

خب میاد یسری کوئری های ورودی رو فیلتر اعمال میکنه دیگه ، آقا اصلاً تو استفاده نکن ، عجب بدبختیه هااااااا Dodgy
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان