دانشنامه طراحی و برنامه نویسی تحت وب

آیا می دانید شما می توانید آموزش ، اسکریپت و یا مقاله مورد نظرتان را از ما کاملا رایگان درخواست کنید ؟
        برای درخواست اینجا کلیک کنید
مقالات کلوب

۴۵ مطلب توسط «سید فرزاد سید عربی نژاد» ثبت شده است

باگ های کلوب رفع شد ؟

سید فرزاد سید عربی نژاد | چهارشنبه, ۱۶ مرداد ۱۳۹۲، ۰۲:۲۵ ق.ظ | ۰ نظر

با عرض سلام  و پوزش

بعد یه مدتی که درگیر یه سری کار ها بودیم ، تصمیم گرفتم یه به روز رسانی بکنیم وب لاگ رو ...

با تشکر از تیم برنامه نویسی کلوب ، تغییراتی تویه سورس ها به وجود اومده که خیلی از باگ هایی که دیگه همه میدونستن برطرف شده ! 

یه سری از دوستان گفتن که ما باگ هاشون رو لو دادیم و از این سری حرف ها ! ولی در اصل چیزی که بوده : ما فقط باگ هایی که خودمون پیدا کرده بودیم رو لو دادیم ! نه اونم لو دادن به اون شکل ! فقط یه سری لاگ از پکت هایی که می فرستادیم رو براشون پیام کردیم و اونا بودن که فهمیدن کجای داستان رو شل گرفتن و این باگا از کجا سر چشمه میگیره و تقریبا جلشون رو گرفتن (XSS خطر ناک ترین کاری که میشد با روم هارو کرد رو فعلا بستن) ، در مورد اینکه از این همکاری چی گیر ما اومد ! بماند ... خیلی شایعه ها شد ولی همشون الکی بوده و تکذیب میشه (حتی اونایی که واقعین)  :D حتی یه سری شنیدیم شکایت کردن و ما الان تو زندانیم :)) بیخیال ....


بگذریم ! اما امروز یه سری به کد های جدید زدم و یه سری حفره هارو دیدم که هنوز پر نشدن !!! 4 تا باگ رو من تو این چند ساعت تونستم از این راه پیدا کنم ! که قول دادیم به هیچ وجه ممکن این باگ هارو ما لو ندیم ! اینجوری به نفع همه هست ! اگه هم لو رفتن توسط دیگران ما دیگه مسئولیتی نداریم و ما هم برای رفع اونا اقدام نمیکنیم ^_^ 


تو پست بعدی از ریشه تا ته اتفاقی که شما موقع ورود به روم می افته رو میگم ! قبلا چون امنیت این بخش کم بود لو نداده بودیم ! ولی الان تقریبا امنیتیش خوبه تو بحث جعل اکانت و XSS تو روم ، پس تا پست بعد یا علی

  • سید فرزاد سید عربی نژاد

رفع باگ اکانت های جعلی (تشکر از تیم برنامه نویسی کلوب و آقای آقا محمدی)

سید فرزاد سید عربی نژاد | يكشنبه, ۲ تیر ۱۳۹۲، ۰۵:۵۷ ب.ظ | ۰ نظر

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

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


اما مشکل چگونه حل شد ؟

در کد هایی که قبلا توضیح داده شده بود پکت XML ارسالی توسط مرورگر کاربران فیلد یوزرنیم نداشت و با تغییر در اساس نام کاربری  و عکس در صفحه اکانت ، میتونستید اکانت جعلی بسازید ولی حال نام کاربری هم همراه پکت به سمت سرور ارسال میشه و اگه با نام کاربری شما یکسان نباشه پیام رو بلوک میکنه ! 

xml += "<jabber_username>" + jabber_username + "</jabber_username>\n";

به نظر میاد روش منطقی باشه ! با تشکر از توجه شما

  • سید فرزاد سید عربی نژاد

یک پیشنهاد کلی برای رفع مشکلات روم به تیم برنامه نویسی کلوب

سید فرزاد سید عربی نژاد | يكشنبه, ۲ تیر ۱۳۹۲، ۱۱:۱۲ ق.ظ | ۰ نظر

برای حل باگ اول از همه باید خود باگ و علت به وجود اومدن باگ رو مشخص کنیم ، که این کار بسیار ساده و کاملا مشخص است !

1- اطلاعات اکانت کاربران در هنگام ورود به روم به داخل کد جاوا اسکریپتی وارد میشود (که میشود با یک پلاگین ساده اونارو عوض کرد)

2- اطلاعات مهم پکت های ارسالی به سرور ، مثل نام کاربری ، عکس پروفایل ، نام و ... درون فایل جاوااسکریپتی تهیه میشوند و سپس به سرور ارسال میشود (که با گوگل کروم به راحتی میشود همه اطلاعات اون پکت هارو دست کاری کرد)

و در کل به نظر شخصی من استفاده از جاوا اسکریپت برای ساخت پکت و اضافه کردن نام کاربری ، عکس و ... توسط جاوا اسکریپت  کار عاقلانه ای نیست ! (حتی با توجه با اینکه تحت کلاینت هست و فشار سنگینی از روی دوش سرور بر میدارد)


برای حل این مشکل یک راه که به ذهن من میرسه استفاده از یک صفحه تحت سروری مثلا sendpacket.php هست که به صورت AJAX با جاوا اسکریپت متن به این صفحه ارسال شود و در اونجا نام کاربری ، عکس پروفایل ، بررسی لاگین یا لاگات بودن ، مسدود یا آزاد بودن  و ... به پکت اضافه بشه و سپس به سمت سرور ارسال بشه .

شکل زیر روش ارسال پکت توسط خود کلوب و روش پیشنهادی مارو مشخص میکنه :



در روش پیشنهادی متن وارد شده داخل TEXTAREA بعد از کلید اینتر توسط جاوا اسکریپت AJAX به داخل فایل PHP ارسال میشود و پکت جهت ارسال نهایی آماده و سپس به سمت فایل فلش میفرسته و اون به سمت سرور پاس میده اون رو.


در این حالت کاربر متوجه نخواهد شد ساختار پکت ایجادی در PHP چگونه است ! و چون این فایل تحت سرور هست ، همون لحظه درخواست ارسال متن نام کاربری و بقیه اطلاعات به پکیت XML اضافه و ارسال خواهند شد .

روش های دیگه ای هم هست که بعضی های هزینه سنگین زمان رو دارن   ، و چند روش ساده که موقتی خواهد بود نیز هست ، ولی پیشنهاد بالایی به نظرم تا مدت زمان خوبی امنیت رو دوباره به روم های کلوب برمیگردونه .



  • سید فرزاد سید عربی نژاد

از اکانت های جعلی بترسید

سید فرزاد سید عربی نژاد | شنبه, ۱ تیر ۱۳۹۲، ۱۱:۲۶ ب.ظ | ۰ نظر

راز باگ خطرناک اتاق گفتگوی کلوب بالاخره فاش شد ٬ با این باگ کاربران میتوانند به طور کامل خود را جای کاربران عادی ٬‌ دوستان شما ٬‌ مدیران کلوب ٬‌ پلیس کلوب و حتی مدیران سایت جا زده و وارد روم های کلوب بشوند ‌و با شما چت کنند ! مراقب باشید 


(برای بزرگنمایی روی تصویر کلیک کنید)

  • سید فرزاد سید عربی نژاد

ارسال تصویر بر روی کتیبه دیگران (غیر فعال شد)

سید فرزاد سید عربی نژاد | پنجشنبه, ۳۰ خرداد ۱۳۹۲، ۰۱:۳۹ ب.ظ | ۰ نظر

روش کاری خیلی ساده هست، 

قبل از همه چیز با گوگل کروم به پروفایل که می خواهید براش عکس بفرستید برید و بر روی کادری که متن مینویسند کلیک کنید تا بخش لینک و ویدیو فعال بشه



حال تو قسمت پایین که باز شده رویه دکمه لینک کلیک کنید


قسمت پایینش که باز شد ، رویه اون بخشی که لینک رو مینویسن راست کلیک کنید و inspect element رو بزنید


حال روی اون بخشی که خودش آبی میکنه راست کلیک کنید و گزینه Edit as HTML رو بزنید


حال کد زیر رو جایگزین اون خطی کنید که انتخاب میشه :


<input type="text" name="data[link]" id="userWall_attachForm_image_textbox" value="http://" class="formText attachForm_link_textbox english" onclick="userWall_attachForm_imgTextbox_onclick()" onkeydown="userWall_attachForm_imgTextbox_onclick()" onkeyup="userWall_attachForm_imgTextbox_onclick()" onblur="userWall_attachForm_imgTextbox_onclick()">


بعد این کار ، تویه کادر سفید کنار صفحه کلیک کنید و دکمه های CTRL + S را بزنید تا تغییرات اعمال شود، و سپس تویه اون کارد آدرس عکس رو بدید به جای لینک ، عکس به کاربر ارسال میشود.


با تشکر از REzA aDmin anonymous


  • سید فرزاد سید عربی نژاد

فهمیدن اکانت کاربرانی که مخفی وارد روم میشن و مسدود کردن آنها

سید فرزاد سید عربی نژاد | پنجشنبه, ۲۶ ارديبهشت ۱۳۹۲، ۰۱:۲۳ ب.ظ | ۵ نظر

به تازگی افرادی پیدا شده اند که با روش هایی (که جاش نیست توضیح بدم) به صورت مخفی وارد روم های کلوب می شن بدون اینکه اسمشون دیده بشه و یا تویه رخداد ها ثبت بشه شروع به هنگ دادن روم ها میکنن ، که از طریق عنوان صفحه مرورگر فقط متنی که ارسال میکنن قابل مشاهده است، تویه این آموزش که مربوط به مدیران و معاونین کلوب ها میشه میخوام نحوه شناسایی این کاربرا و نحوه مسدود کردنشون رو آموزش بدم .

روند کار خیلی ساده هست !  (توجه کنید برای مسدود سازی و اخراج کاربر باید حتما مدیر و یا معاون باشید)


1- با گوگل کروم وارد روم شوید و بر روی صفحه راست کلیک کرده و روی گزینه Inspec Element کلیک کنید (برای بزرگنمایی تصویر روی آن کلیک کنید)

مخفی کردن نوشته های یکی در روم


2- در صفحه باز شده به بالای صفحه برید و فِلِش مربوط به کد <head>...</head> را باز کنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس دوم تغییر فونت در کلوب


3- حال بر روی http://static.cloob.com//public/scripts/jabber_new/base_lib.js?30 کلیک کنید  (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس سوم تغییر فونت در کلوب


4- در این صفحه به سطر 657 رفته و کدی که پایین نوشته شده رو کپی کنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

مخفی کردن نوشته های یکی در روم

کد مربوطه :  (نیازی به تغییر کد نیست و فقط یادتون باشه بعد از کپی کردن کد زیر مینویسه برگرفته شده از wikiweb.blog.ir ، که این جمله رو باید پاک کنید)
body = persianUrl.decode(body+' | نوشته شده توسط '+datafrom.username);

حالا دکمه های CTRL و S را در کیبورد فشار دهید تا تغییرات اعمال شود.

بعد از انجام مراحل بالا صفحه شما باید به شکل زیر خواهد شد : (برای بزرگنمایی تصویر روی آن کلیک کنید)

شناسایی کاربران مخفی

خوب الان چه اتفاقی افتاد ! اگه به روم دقت کنید بعد از ارسال متن توسط اعضا در آخر آن مینویسه نوشته شده توسط (نام کاربری طرف)

این به ما کمک میکنه که تویه عنوان صفحه هم این اتفاق بی افته ، شما کافیه رویه یه صفحه دیگه کلیک کنید و تویه عنوان نام کاربری کسی که مخفی داره هنگ میده نمایش داده بشه :

برای مثال عکس زیر رو مشاهده کنید :

شناسایی کاربران مخفی

مشاهده میکنید که نام کاربری frd_ir به صورت مخفی داره به داخل روم شکلک ارسال میکنه و داره روم رو هنگ میده ! خوب الان نام کاربری رو بدست آوردیم ! چطوری میشه اون رو مسدود کرد ؟

برای مسدود کردن اون کافیه به لینک زیر برید :

http://frdblog.persiangig.com/bans.html
در صفحه باز شده باید 3 تا مقدار وارد کنید که به ترتیب میگم چین :


user name : نام کاربری کسی که داره روم رو هنگ میده و از اون عنوان صفحه به دستش آوردیم

cloob name : اسم انگلیسی کلوبی که در اون دارن این کار رو میکنن برای فهمیدن اسم کلوب کافیه به صفحه اصلی کلوب مورد نظر برید و از طریق آدرس صفحه اونو بدست بیارید

برای مثال نام کلوب در شکل زیر PaR_PaRaK هست

نام کلوب


chat room : شماره رومی که دارن توش هنگ میدن ، برای بدست آوردن این شماره کافیه بالای صفحه روم کنار عکسش اون عدد رو کپی کنید

برای مثال شماره روم در تصویر زیر 26760 هست

شماره روم

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

شکل کلی صفحه شوتینگ به شکل زیر خواهد بود :

اخراج کاربر از روم


و در پایان یادآور میشم برای استفاده از برنامه شوتینگ باید با اکانت معاون یا مدیر تویه همون مرورگر از قبل وارد شده باشید.

امیدوارم مشکلتون رو حل کنه ، در صورتی که سوالی پیش اومد تویه نظرات با ما درمیان بزارید .

به امید حق یا علی
  • سید فرزاد سید عربی نژاد

نحوه ی ایجاد اتاق گفتگو در رسانه (غیر فعال شد)

| دوشنبه, ۲۳ ارديبهشت ۱۳۹۲، ۱۰:۵۴ ق.ظ | ۰ نظر

سلام  در این آموزش نحوه ی ایجاد  اتاق گفتگو برای رسانه رو یادتون میدم

مراحل کار بسیار ساده هست :


به لینک زیر برید :

http://www.cloob.com/club/room/new/clubname/_ROOT

در آدرس بالای صفحه به جای _ROOT نام رسانه خودتون رو بنویسید (برای بزرگ نمایی تصویر بر روی آن کلیک کتید)

ایجاد روم برای رسانه

حالا مثل همه کلوب ها تو صفحه باز شده مشخصات روم رو بنویسید و ایجاد رو بزنید (برای بزرگ نمایی تصویر بر روی آن کلیک کتید)

ایجاد روم برای رسانه


فقط برای اینکه کاربرا بتونن به روم دسترسی داشته باشن نیز این لینک رو در اختیارشون قرار بدید :

http://www.cloob.com/club/room/list/clubname/اسم رسانه به انگلیسی


نوشته شده توسط REzA aDmin anonymous

مخفی کردن نوشته های یک نفر در روم

سید فرزاد سید عربی نژاد | يكشنبه, ۲۲ ارديبهشت ۱۳۹۲، ۰۲:۴۰ ب.ظ | ۲ نظر

در ادامه بحث قبلی که در دیدیم یه متن چه شکلی به سرور ارسال میشه ، حالا باید دید یه متن چطوری از سرور دریافت و تویه روم نمایش داده میشه 

چون روند این کار خیلی به درد نمی خوره من خلاصه با یه مثال تویه فایل Base_lib بررسی میکنم ، امیدوارم به کارتون بیاد


مثال : ما میخواهیم کاری کنیم که یک یوزر خاصی رو کاری کنیم که نوشته هاش رو تویه روم نبینیم (این مثله زیاد برای من پیش میاد برا شمارو نمیدونم)


برای این کار باید بدونید تمام نوشته ها که XML شده بوده اند و به سرور ارسال شده بود ، به سیستم های کاربر ها ارسال میشه و به صورت HTML به داخل روم فرستاده میشه تا همه یوزر ها اون رو ببیند ، اما من نحوه HTML کردن اینارو کاری ندارم چون عملا چیزی از توش در نیومد :| 


امیدوارم با کمی تغییر و ارتقا این سیستم رو مسولان کلوب رویه همه روم ها بزارن (اگرم نذارن خودم نسخه های بعدی رو میدم)


برای این کار مراحل زیر رو انجام دهید :


1- با گوگل کروم وارد روم شوید و بر روی صفحه راست کلیک کرده و روی گزینه Inspec Element کلیک کنید (برای بزرگنمایی تصویر کلیک کنید)

مخفی کردن نوشته های یکی در روم


2- در صفحه باز شده به بالای صفحه برید و فِلِش مربوط به کد <head>...</head> را باز کنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس دوم تغییر فونت در کلوب


3- حال بر روی http://static.cloob.com//public/scripts/jabber_new/base_lib.js?30 کلیک کنید  (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس سوم تغییر فونت در کلوب


4- در این صفحه به سطر 657 رفته و کدی که پایین نوشته شده رو کپی کنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

مخفی کردن نوشته های یکی در روم

کد : 

if(datafrom.username=='نام کاربری'){
    return false;
}

تو اون قسمت نام کاربری،  کسی که نمیخواهید متنش رو تویه روم ها ببینید رو بنویسید (فقط یادتون باشه بعد از کپی کردن کد زیر مینویه برگرفته شده از wikiweb.blog.ir ، که این جمله رو باید پاک کنید) و دکمه های CTRL + S رو رویه کیبورد بزنید.

در آخر باید صفحه ی شما به شکل زیر باشد :(برای بزرگنمایی تصویر روی آن کلیک کنید )

مخفی کردن نوشته های یکی در روم

یاد آوری میکنم CTRL + S رو حتما بزنید تا تغییرات ذخیره بشه ، حالا این کسی که نام کاربریشو وارد کردید هر چقدر تویه روم بنویسه نمایش داده نمیشه .

اما ! اگه بخواین چندین نام کاربری رو بزارید کافیه کد بالا رو به شکل زیر تغییر بدید : (با علامت || میتونید تا بینهایت نام کاربری اضافه کنید) 

if(datafrom.username=='نام کاربری 1' || datafrom.username=='نام کاربری 2'){
    return false;
}

با تشکر از توجه شما ، امیدوارم به دردتون بخوره
مارو میتونید در رسانه کلوب  : www.cloob.com/_ROOT دنبال کنید


  • سید فرزاد سید عربی نژاد

نگاهی مختصر به ساختار چت روم کلوب از دید Client - بخش اول

سید فرزاد سید عربی نژاد | شنبه, ۲۱ ارديبهشت ۱۳۹۲، ۰۴:۵۰ ب.ظ | ۰ نظر

ساختار کلی :

در واقع اکثر و میشه گفت تمام سیستم های گفتگوی متنی آنلاین گروهی یک ساختار واحدی رو دنبال میکنند که شامل :

 - محیطی که کاربر متن خودش رو در اون وارد میکنه (تحت کلاینت)

 - تکه کدی که یک سری پردازش روی این متن انجام میشه (تحت کلاینت)

 - فایل و یا کدی که این پردازش حاصل شده رو به سرور ارسال میکنه (تحت کلاینت)

- سرور که اطلاعات رو گرفته آنلایز و پاسخ میده (تحت سرور)

 - کدی که اطلاعات دریافتی از سرور رو میگیره و برای چاپ آماده میکنه (تحت کلاینت)

 - محیطی که کاربر متن های گفتگو شده رو میبینه (تحت کلاینت)

ما با بخش سرور کاری نداریم چون در حالت عادی اصلا دسترسی نداریم بهش  !

ولی 5 بخش در سیستم کاربر یا همون سیستم ماها پردازش و اجرا میشه ، پس اگه بتونیم سیستم و ساختار اون رو بشناسیم می تونیم یه کارایی باهاش بکنیم !!!!


خوب من این بخش هارو که گفتم رو یکی میرم جلو ببینیم چی میشه :|


• محیطی که کاربر متن خودش رو در اون وارد میکنه

این بخش در محیط گفتگوی کلوب یک جعبه متن هست (textarea) که متن رو دریافت میکنه 

انلایز چت روم کلوب دات کام

کد HTML مربوط به کادر متن :

<textarea class="chatPageV2_containerChatForm_textbox" id="chat_body" onkeyup="base_check_composing()" onkeypress="base_checkEnterKey(event)" style="direction: ltr; height: 48px; overflow: hidden;"></textarea>

اگه دقت کرده باشین این تکه کد یک پارمتر داره به نام onkeypress که وقتی دکمه ای فشار داده بشه تابعی با نام base_checkEnterKey شروع به فعالیت میکنه که این تابع درون فایل جاوااسکریپتی هست به نام base_lib.js که در آدرس زیر میتونید کد های مربوط به اون رو ببینید :

http://static.cloob.com//public/scripts/jabber_new/base_lib.js

از طریق Inspect Element نیز می تونید به کد این صفحه دسترسی داشته باشید و حتی به صورت آنلاین اون رو ویرایش کنید و دوباره اجراش کنید. (این نکته مهمیه ! چون با همین روش خیلی کار ها میشه کرد)


اما کد اون تابع که گفتیم وقتی onkeypress میشه اجرا میشه به این صورته :


function base_checkEnterKey(e){
    var key;
    var shiftKey=false;
    if(window.event){
        key = window.event.keyCode;     //IE
        shiftKey=window.event.shiftKey;
    }else{
        key = e.which;     //firefox
        shiftKey=e.shiftKey;
    }
    if(!shiftKey && key == 13){
        base_send_message();
    }

}

در کد بالا چند شرط ساده رو میشه دید ! ولی چیزی که به درد ما میخوره شرط آخر هست .


شرط به این ترتیبه که میگه وقتی دکمه 13 کیبورد (کد اسکی) فشار داده شد تابع جدیدی به نام base_send_message رو اجرا کن ، که خوشبختانه این تابع تویه همین صفحه base_lib.js هستش.


خوب تا اینجا یه مروری میکنیم > وقتی شما دارین تویه کادر متن تایپ میکنید تابع اولی (onkeypress) بررسی میشه و تا وقتی دکمه اینتر (کد 13) زده نشه هیچ اتفاقی نمی افته تا اینکه شما اینتر رو بزنید و تابع دوم اجرا میشه که این تابع هست : base_send_message


کد این تابع به شکل زیر هست

function base_send_message(){
	var msg_out = c_$('chat_body').value;
	msg_out = strGetTrim(msg_out);

    msg_out = base_limitText(msg_out);


	if(msg_out=='buzz'){
		if(!other_alarmreq[base_active_Receiver_name] && !c_$('chat_body').disabled && base_active_Receiver_type=='chat'){
			other_setBuzz();
		}
		else{
			c_$('chat_body').value='';
			return false;
		}
	}
	
	if(base_active_Receiver_name!='' && msg_out!='' && (base_active_Receiver_type=='chat' || msg_out!='buzz')){
		c_$('chat_body').value = '';
		var content = new Array();
       // msg_out = msg_out.replace("\n",_msg_break_line_split) ;
        msg_out = msg_out.split("\t").join(_msg_break_tab_split);
        msg_out = msg_out.split("\n").join(_msg_break_line_split);
		content['body']= persianUrl.encode(msg_out);
		var rec_type = '';
		var rec_Nickname = '/'+jabber_resource;
		var chatType = 'chat';
		if(base_active_Receiver_type!='chat'){
			var rec_type = base_active_Receiver_type+'.';
			rec_Nickname = '';
			chatType = 'groupchat';
		}
		else{
			content['offline']= true;
		}
		var base_rec = base_active_Receiver_name+'@'+rec_type+jabber_serverName+rec_Nickname ;
		
		var sender = jabber_username+'@'+jabber_serverName+'/'+jabber_resource ;
		var msgid = '';

        var objName = base_active_Receiver_type+__base_split_Type_Name+base_active_Receiver_name;

        if(base_active_Receiver_type=='chat'){
            msgid = chatType + "_" + base_getrandid();
            base_fill_chatbox(sender,base_rec,msg_out,jabber_firstname,jabber_fullname,jabber_userphotoPath,'',msgid);
		}
        else{
            if(!base_clubroom_sendMessage_timer[objName]){
                base_clubroom_sendMessage_timer[objName]=setTimeout(function(){
                    if(base_chatData_Arr_Write[objName]){
                        base_chatData_Arr_Write[objName] = null ;
                        c_$('chat_body').disabled = 1;

                        base_clubroom_sendMessage_timer[objName]= null;
                    }

                },1000);
            }
        }
		

		this_key = base_chatData_Arr_Msg_Key[objName] ;
		base_chatData_composing[objName] = false;

        jabber_SendMessage(base_rec, chatType, msgid, content, '','',this_key);

	}
	c_$('chat_body').value = '';
    setTimeout(function () {
        c_$('chat_body').value = '';
        c_$('chat_body').focus();
    }, 20);
	//c_$('chat_body').focus();
	return false;
}

چند نکته مهم و جالب اینجا هست که فقط به بررسی اونها می پردازم و بقیه کد هایی که اینجا نوشته عملا به درد ما نمیخوره


یکی از این تکه کد ها c_$('chat_body').value این هست ! این تیکه کد در واقع مقداری که شما تویه اون کادر متن تو صفحه نوشتین رو نشون میده ، و چند جا ازش استفاده شده مثلا :

در آخر اون رو خالی کرده (یعنی وقتی متن شما ارسال میشه میبینید که متن تویه کادر پاک میشه) :

 c_$('chat_body').value = '';

در بخش های بالاتر هم کد مربوط به بررسی و ارسال این متن نوشته شده (که بعدا در مورد شرح کامل این بخش تو آنالیز های بعدی خواهم پرداخت) ولی مهمترین بخش این کدها دستور زیر هست که متن نوشته شده رو به یک تابع دیگه به نام  jabber_SendMessage ارسال میکنه 

        jabber_SendMessage(base_rec, chatType, msgid, content, '','',this_key);
(فقط یه چیزی بگم اون جابر منظور اسم جابر نیست بلکه به معنی گپ و گفتگوه :D)

خوب اما این تابع کجا هست ؟ و چه مقدار هایی بهش ارسال میشه ؟؟؟

base_rec :  اولین پارمتری که به داخل این تابع ارسال میشه شماره و یا شناسه چت روم هست ! که با استاندارد زیر ساخته میشه :

شناسه روم@clubroom.jabber.cloob.com
این شناسه روم رو از کجا میشه فهمید ؟؟ خیلی آسون هست بالای هر رومی که برید این شماره نوشته شده برای مثلا : room_26760

انلایز چت روم کلوب دات کام

chatType : این پارامتر مقداری که میگیره نوع صفحه چت شما رو مشخص میکنه ، که آیا این متن مربوط به یک روم عمومی (groupchat) هست یا چت خصوصی (chat)

msgid : پارامتر بعدی یک رشته و عدد ساخته شده توسط خود کلوب هست که به متن شما یک شناسه میده ! که اگه این شناسه رو تکراری هم بزنید مشکلی بوجود نمیاد (این یعنی ضعف امنیتی)


content : مهمترین پارامتر میشه گفت همیه ، که یک آرایه هست (یعنی یه مقدار نیست بلکه چندین مقدار توش قرار داره) که متن اصلی که میخوایم ارسال کنیم به سرور تا به همه نشون بده از درون این آرایه به تابع بعدی (jabber_SendMessage) ارسال میشه


'' ,'' : این پارمتر ها خالی ارسال میشن و تویه چت گروهی استفاده ای نداره ، ولی تویه چت خصوصی دیلوری یا همون تیک سبز کچولو که کنار متن میاد با این ها ارسال میشن


this_key : پارامتر آخر هم یکی از مهم ترین پارمتر های ارسالی هست ، این پارامتر هم کلید روم هست، منظور از کلید در واقع میشه گفت پسورد روم ، که شما در حال عادی نمی بینید اینجوری در نظر بگیرید که پارمتر اولی یوزر و پارمتر آخر پسورد روم هست که به کمک اونا کلوب میفهمه متن باید کدوم روم بره نمایش داده بشه ، برای مثلا یک کلید روم این هست : e94786029126289353dba4aa826f0d59


خوب همه این موارد که پر شدن (که اکثر پارامتر ها توسط خود کلوب پر میشن که قابل ویرایش توسط ما هم هستن ، و یکی که متن ما هست content) آماده ارسال به تابع jabber_SendMessage میشه 


این تابع (jabber_SendMessage) کدهاش مثلا از دید ما پنهان شده اند و در یک فایل جاوااسکریپت دیگه به نام  g.chatroom.new.v4.js قرار داره که این فایل توسط یک سری ساختار کدگذاری شده که نشه فهمید درون این فایل چه اتفاقی می افته ، و من به حق برنامه نویس کلوب احترام میزارم و کل فایل رو دیکود شده اینجا نمی نویسم فقط یه تیکه هاییش رو مینویسم (که اگه خودتون یکم زرنگ باشین دی کودرش رو پیدا میکنید) 

آدرس فایل : 

http://static.cloob.com//public/scripts/jabber_new/g.chatroom.new.v4.js

خوب حالا این پارمتر ها که از تابع قبلی به داخل  jabber_SendMessage که کد شده هست ارسال کردیم چه اتفاقی می افته ؟

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

function jabber_SendMessage(to,type,id,content,payload,composing,cloobkey){
			if(to){
				if(!id){
					id=type+"_"+base_getrandid()
				}
				xml="<message to='"+to+"' type='"+type+"' id='"+id+"'>\n";
				if(content['subject']){
					xml+="<subject>"+content['subject']+"</subject>\n"
				}
				if(content['thread']){
					xml+="<thread>"+content['thread']+"</thread>\n"
				}
				if(composing){
					xml+="<composing>"+composing+"</composing>\n"
				}
				else if(content['body']){
					xml+="<body> "+base_codeSpChars(content['body'])+"</body>\n"
				}
				if(content['offline']){
					xml+="<x xmlns='jabber:x:event'><delivered/></x>\n"
				}
				xml+="<cloobkey>"+cloobkey+"</cloobkey>\n";
				xml+="<firstname>"+jabber_firstname+"</firstname>\n";
				xml+="<fullname>"+jabber_fullname+"</fullname>\n";
				xml+="<photopath>"+jabber_userphotoPath+"</photopath>\n";
				xml+=payload;
				xml+="</message>\n";
				Jabber_AddToLog('send msg : '+xml);
				jabber_sendPacket(xml)
			}
		}

اگه یکم دقیق نگاه کنید کاملا مشخص هست چی به چیه ! اون پارمترها رو که پاس کردیم اینور رو میگره و یک رشته XML تولید میکنه ! 


خوب الان به یک نکته ای میرسیم ! متن و مشخصات ما قبل از ارسال به سرور و نمایش تویه روم به XML تبدیل میشن ! و این خیلی خوبه از نظر کد نویسی و من به برنامه نویسی که اینو نوشته تبریک میگم که XML رو برای ساختار جابجای متن ها انتخاب کرده ، (اگر بخواید بدونید XML چیه ! یه توضیح کوتاه تو همین وبلاگ نوشتم)


خوب برگردیم سر موضوع اصلی بعد از ساخته شدن یه رشته XML ، این رشته به داخل یک تابع دیگه ارسال میشه به نام jabber_sendPacket !!

برای مثال یک رشته XML ایجاد شده توسط کلوب به شکل زیر میشه »

<message to='room_26760@clubroom.jabber.cloob.com' type='groupchat' id='groupchat_6033876b3937314a'>
<body> متن تست</body>
<cloobkey>e9a62906886a5adca7e21287d0fbac11</cloobkey>
<firstname>اربابــــــ</firstname>
<fullname>اربابــــــ</fullname>
<photopath>/public/user_data/user_photo/715/2545741.jpg</photopath>
</message>
رشته XML بالا به تابع jabber_sendPacket  ارسال میشه ! و یک سری اتفاقات مهیج و جالب اونجا انجام میشه ! که من این قسمت هارو برای نگه داشتن ضریب امنیتی روم ها خلاصه وار رد میشم ، ایشاا... چند تا نکته مهم توسط مدیران کلوب رفع میشه و من اون موقع سورس اونهارو هم رو میکنم . خوب بگذریم ...

بعد از آماده شدن رشته بالا ، در تابع jabber_sendPacket  یک سیشن ایجاد میشه و یک پـ ـــــــــــروکـــــ ــــسی که کلوب اسمش رو گذاشته فلش پــــــ ــــروکـــ ــســ ـی فراخوانی میشه ، این فلش ه در واقع تویه همون صفحه چت روم هست ولی دیده نمیشه که 
آدرس اون :
http://www.cloob.com/public/public/images/flashjsproxy/JsSocketProxy_chat_443?84821248
که به آخرش یه SWF اضافه کنید همون فایل فلش هست ، ولی چیزی برای نمایش نداره ، در واقع چند سطر کد داره که اگه دیکامپایلر داشته باشید میتونید بفهمید این کد ها چین که من اینجا میزارمشون . 
این فلش پـــــروکــــــــ ســـــــ ـی فایل XML که آماده شده رو با یک پورت ایمن SSL 443 به سرور مربوط به گفتگو ها ارسال میکنه 

کد اکشن اسکریپت ارتباط با سرور چت کلوب : 
System.security.loadPolicyFile("xmlsocket://chat.cloob.com:443");
var  = new JSP();
و کد اکشن مربوط به دریافت اون XML که از طرف فایل جاوا اسکریپت در سیستم شما ارسال شده :

// Action script...

// [Initial MovieClip Action of sprite 1]
#initclip 1
class JSP
{
    var _eventHandler, _socket;
    function JSP()
    {
        flash.external.ExternalInterface.addCallback("connect", this, connect);
        flash.external.ExternalInterface.addCallback("sendMessage", this, sendMessage);
        flash.external.ExternalInterface.addCallback("disconnect", this, disconnect);
        flash.external.ExternalInterface.addCallback("setEventHandlers", this, setEventHandlers);
        _eventHandler = new Object();
        _socket = new XMLSocket();
        _root.jsP = this;
        _socket.onConnect = function (success)
        {
            _root.jsP.raiseEvent(_root.jsP._eventHandler.on_connect, [success]);
        };
        _socket.onClose = function ()
        {
            _root.jsP.raiseEvent(_root.jsP._eventHandler.on_disconnect, []);
        };
        _socket.onData = function (msg)
        {
            _root.jsP.raiseEvent(_root.jsP._eventHandler.on_message, [msg]);
        };
    } // End of the function
    function connect(host, port)
    {
        var _loc3 = _socket.connect(host, port);
        if (!_loc3)
        {
            var _loc2 = new Object();
            _loc2.type = "connectError";
            this.raiseEvent(_eventHandler.on_error, [_loc2]);
        } // end if
    } // End of the function
    function sendMessage(msg)
    {
        _socket.send(msg);
    } // End of the function
    function disconnect()
    {
        _socket.close();
    } // End of the function
    function setEventHandlers(eventHandlers)
    {
        for (var _loc2 = 0; _loc2 < eventHandlers.length; ++_loc2)
        {
            _eventHandler["on_" + eventHandlers[_loc2].name] = eventHandlers[_loc2].handler;
        } // end of for
    } // End of the function
    function raiseEvent(handlerName, args)
    {
        flash.external.ExternalInterface.call(handlerName, args);
    } // End of the function
} // End of Class
#endinitclip

خوب ! فعلا تا اینجا بسه ، بخش بعدی آنالیز مربوط به این هست که متنی که ارسال شده چطوری وارد صفحه روم ما میشه !

چیزهایی که الان گفتم میشه خیلی کارا کرد ، ولی این مطالب برای استفاده های سودمند تهیه شده (مثل تغییر فونت ، تغییر شکل ظاهری صفحه ، آشنایی و پیدا کردن راه حل های جدید برای مبارزه با برخی مثائل بوجود اومده در روم ها و ...) و مسئولیت استفاده آن به هر نحوی به عهده شخص می باشد.

• یه پلاگین هم به زودی با استفاده از همین ها ارائه خواهم داد که می تونید به کمک اون هر کسی رو که دوست نداشتید متنش رو تویه روم ببینید تمام متن هاش رو بلاک کنید و تویه روم برای شما دیده نشه.

با تشکر از توجه شما اگه غلط املایی یا هر چی بوده ببخشید دیگه :|

  • سید فرزاد سید عربی نژاد

CHANGE CHAR _ JAVASCRIPT - تغییر فونت در روم کلوب

سید فرزاد سید عربی نژاد | پنجشنبه, ۱۹ ارديبهشت ۱۳۹۲، ۰۱:۱۳ ب.ظ | ۰ نظر

با گوگل کروم وارد یکی از روم ها شوید و بر روی صفحه راست کلیک کنید و گزینه Inspect element را بزنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس اول تغییر فونت در کلوب

در صفحه باز شده به بالای صفحه برید و فِلِش مربوط به کد <head>...</head> را باز کنید (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس دوم تغییر فونت در کلوب

حال بر روی http://static.cloob.com//public/scripts/jabber_new/base_lib.js?30 کلیک کنید  (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس سوم تغییر فونت در کلوب

خوب در صفحه باز شده به سطر 364 برید و کدی که پایین صفحه نوشتم رو اونجا کپی کنید ، فقط یادتون نره آخر متن یه جمله میاد : برگرفته شده از wikiweb.blog.ir این جمله رو از آخر اون پاک کنید و کلید های CTRL + S بر روی کیبورد را بزنید تا ذخیره بشه (برای بزرگنمایی تصویر روی آن کلیک کنید )

عکس چهارم تغییر فونت در کلوب

for(r=0;r<msg_out.length;r++){

msg_out=msg_out.replace("A","Ⓐ"); 

msg_out=msg_out.replace("B","Ⓑ");

msg_out=msg_out.replace("C","Ⓒ");

msg_out=msg_out.replace("D","Ⓓ");

msg_out=msg_out.replace("E","Ⓔ");

msg_out=msg_out.replace("F","Ⓕ");

msg_out=msg_out.replace("G","Ⓖ");

msg_out=msg_out.replace("H","Ⓗ");

msg_out=msg_out.replace("I","Ⓘ");

msg_out=msg_out.replace("J","Ⓙ");

msg_out=msg_out.replace("K","Ⓚ");

msg_out=msg_out.replace("L","Ⓛ");

msg_out=msg_out.replace("M","Ⓜ");

msg_out=msg_out.replace("N","Ⓝ");

msg_out=msg_out.replace("O","Ⓞ");

msg_out=msg_out.replace("P","Ⓟ");

msg_out=msg_out.replace("Q","Ⓠ");

msg_out=msg_out.replace("R","Ⓡ");

msg_out=msg_out.replace("S","Ⓢ");

msg_out=msg_out.replace("T","Ⓣ");

msg_out=msg_out.replace("U","Ⓤ");

msg_out=msg_out.replace("V","Ⓥ");

msg_out=msg_out.replace("W","Ⓦ");

msg_out=msg_out.replace("X","Ⓧ");

msg_out=msg_out.replace("Y","Ⓨ");

msg_out=msg_out.replace("Z","Ⓩ");

msg_out=msg_out.replace(":d",":D");

}   

msg_out=msg_out.replace("dish",":D");

تغییر فونت در چت روم کلوب ، کد مربوط به سطر 364 در فایل base_lib.js بعد از کد :

var msg_out = c_$('chat_body').value;

در آخر باید اون صفحه به شکل زیر در بیاد (توجه : حتما دکمه های CTRL + S رو برای ذخیره شدن بزنید)

عکس پنجم تغییر فونت در کلوب

  • سید فرزاد سید عربی نژاد