توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : سوال تغییر مقادیر فیلد Password با دستور SQL
Pr0grammer
10-18-2012, 07:03 PM
با سلام...
من با استفاده از دستور SQL زیر مقدار فیلد username رو از مثلاً a1 ، a2 ، a3 و... به b1 ، b2 ، b3 و ... به راحتی تغییر دادم :
update `jos_users`
set `username` = replace(`username`,"a","b");
اما حالا میخوام مقدار فیلد password رو هم تغییر بدم ولی همونطور که میدونید مقادیر این فیلد Encrypt شده هستش! و مقدار a به صورت کد شده در این فیلد ذخیره میشه و نمیشه گفت هرجا a بود به b تبدیل کن!
آیا راهی هست که مشکلم حل شه!؟
samir
10-19-2012, 04:25 AM
سخت نباید باشه... اینو ببین :
UPDATE `jos_users` SET `password` = MD5( 'b' ) WHERE `jos_users`.`password` = MD5( 'a' )
فک کنم کار می کنه...
Pr0grammer
10-19-2012, 05:02 PM
مرسی، اما متاسفانه نشد! :(
حتی کد زیر رو هم امتحان کردم، نشد :
UPDATE `jos_users` SET `password` = replace(`password`, MD5('a'), MD5('b'))
samir
10-19-2012, 10:47 PM
کار می کنه فقط جای اون تک کتیشن، دَبل بزن حله...
UPDATE `jos_users` SET `password` = MD5( "secret" ) WHERE `jos_users`.`password` = MD5( "admin" ) ;
Pr0grammer
10-21-2012, 07:44 AM
0 row(s) affected. ( Query took 0.0091 sec )
:( :( :(
samir
10-21-2012, 07:16 PM
خوب اینکه نمی شه علتش اینه که پسورد ها قبل از اینکه با متد MD5 بخوان Hash بشن و توی بانک نوشته بشن، اول با یه رشتهء رندم دیگه Salt می شن(یعنی نمکشون زیاد می شه اصتلاحا)، که اون رشته رندم با استفاده از همون فیلد معروف secret فایل configuration.php تولید می شه.
مثلا :
var $secret = 'tiDvqWRGWhlKLNHR';
حالا کلا یعنی، پسوردی که الان تو بانک ذخیره شده، برای مثال :
Username: user
Password: pass
به این صورت ِ :
username = user
password = ea92823e6a5118fde6068c343fefc292:WTiMBzsVhCMvZbnZb UqfWaVA3AZ5YzER
که اینطوری درست شده :
جوملا یه رشته 32 بیتی رندم درست کرده که اینه تو این مثال :
salt = WTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER
که همون مقدار salt هست.
حالا پسورد رو که pass باشه به این صورت hash می کنه و بعدم مثل اون بالا که گفتم، یه ':' رو هم به عنوان فیلد جدا کننده استفاده می کنه و اون رشتهء رندم رو هم بهش اضافه می کنه. که می شه :
password = MD5(passWTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER) + ':' + WTiMBzsVhCMvZbnZbUqfWaVA3AZ5YzER
حالا چطور می شه این پسورد encrypt شده رو decrypt کرد؟
جوابش هم ساده است، اصلا نمی شه.
خود جوملا وقتی می خواد ببینه یه یوزر و پسورد مچ هست یا نه، از روی فیلد یوزر، مقدار salt رو پیدا می کنه و پسورد وارد شده رو دوباره hash می کنه و چک می کنه که با بخش اول فیلد پسورد مچ باشه.
خلاصه، نمی تونی با یه کوئری با شرط چک کردن مقدار فیلد پسورد کاری از پیش ببری...
samir
10-23-2012, 08:27 AM
خوب اون بخش آخر که کاری نمی شه کرد ،اشتباه بود...
اینو یه امتحانی بکن :
SELECT * FROM `jos_users` WHERE
Substring_index( `jos_users`.`password` , ':', 1 ) =
MD5( CONCAT( 'PASSWORD' , Substring_Index( `jos_users`.`password`,':', -1)));
که باید جای مقدار PASSWORD همون پسورد خودت رو بزنی، این کوئری سطرهایی که مقدار پسوردشون برابر PASSWORD هست رو برمی گردونه...
حالا که این کار می کنه؛ پس اینم دیگه کار می کنه :
UPDATE `jos_users` SET `password` = MD5( "NEW_PASSWORD" )
WHERE
Substring_index( `jos_users`.`password` , ':', 1 ) =
MD5( CONCAT( 'OLD_PASSWORD' , Substring_Index( `jos_users`.`password`,':', -1)));
فقط یکم مسئله امنیتی داره این کار، اونم اینه که رشته جدید پسورد دیگه salt نشده توی بانک ذخیره می شه... یعنی انگار که مقدار رشته salt الان NULL هست...
vBulletin® v4.2.5, Copyright ©2000-2026, Jelsoft Enterprises Ltd.