TAHA
06-30-2009, 10:28 PM
تائيد اعتبار فرمهاي وب
مرد نامرئي هرزنامه نميپذيرد
آيا تابهحال به اين موضوع انديشيدهايد كه چطور ميتوانيد در مقابل هرزنامهها از فرمهاي وب خود محافظت كنيد؟
هيچكس دوست ندارد، موقع ورود يا ثبتنام يا استفاده از فرمهاي وب، يك مشت حرف كج و معوج ببيند، و آنها را داخل فيلد مورد نظر وارد كند، اما آيا راه بهتري هم هست؟
بله، و بيشتر مردم از چنين راهي براي جلوگيري از حملات هرزنامهها بيخبرند.
در بحثهايي كه براي جايگزيني CAPTCHA ميشود، نظريهاي است كه طبق آن، ميتوان با تشخيص رويدادهاي ماوس و يا فشرده شدن كليدها توسط جاوااسكريپت، از انسان بودن فرمپركننده مطلع شد.
در زير با كمك مثالي ساده، جانشيني براي CAPTCHA ايجاد مي گردد. اما پيش از آن، بايستي نكات زير را در نظر بگيريد.
1 – فرم شما بايد برخي از رويدادهايي كه دليل فعاليت انسانياند، ثبت كند.
2 – اگر جاوااسكريپت فعال نبود، بايد يك جايگزين سريع داشته باشيد.
3 – تمام اين آزمايشها تا حد امكان بايد از چشم كاربر دور بماند.
4 – براي روبوتها فهميدن و دور زدن آزمايشهاي شما، كار دشواري نيست.
آيا من انسانم؟
در ابتدا بايد راهي بيابيم كه فرم بتواند جواب سوال «آيا من انسانم؟» را به كد پشت صحنه بفرستد. بدين منظور، من از فيلد پنهان استفاده كردم. لازم بهذكر است، بر طبق نكات بالا، نام اين فيلد هر چيزي ميتواند باشد. اگر باتها اسم اين فيلد را بدانند، در اين صورت مدار صحيحي از طريق سيستم به آن پاس خواهند داد.
اين فيلد هرجايي ميتواند باشد، اما من قبل از بستن فروم ميگذارمش.
<input type="hidden" name="imahuman
/> " 0" id="imahuman" value="
</form>
كد فوق را ببينيد، مقدار اين فيلد بهطور پيشفرض صفر درنظر گرفته شده است، كه بهمعناي «خير، اين يك انسان نيست» است.
تغيير بهخاطر انسانها
در قطعه زير ميخواهيم وقتي رويداد خاصي اتفاق افتاد، مقدار imahuman را تغيير دهيم. تابعي كه تشخيص آن رويداد را انجام ميدهد، بايد توسط يك كنترلكننده رويداد (EventHandler) كنترل شود و آن كنترلكننده خود از طريق يك فايل خارجي جاوااسكريپت به فايل پيوست شود، مطمئن باشيد كه توي خود كد htmlتان چيزي نمينويسيد.
Set up//
addEvent(window, "load", setUpHumanTest, false);
function setUpHumanTest() {
var myforms = document.getElementsByTagName("form") ;
; i<myforms.length; i++) {0for (var i=
addEvent(myforms[i], "focus", markAsHuman, false);
addEvent(myforms[i], "click", markAsHuman, false);
}
}
function markAsHuman() {
";1document.getElementById("imahuman").value = "
}
var addEvent;
if (document.addEventListener) {
addEvent = function(element, type, handler) {
element.addEventListener(type, handler, null);
if (element.href) element.href="javascript:void('');" ;
{
{
else if (document.attachEvent) {
addEvent = function(element, type, handler) {
element.attachEvent("on" + type, handler);
if (element.href) element.href="javascript:void('');" ;
{
{
else {
addEvent = new Function;
}
حال از بالا به پايين آن را شرح ميدهيم.
– خط آخر به اين معني است كه كافي است يك دستور addEvent را اجرا كنيد و كار را تمام كنيد.
– تابع markAsHuman وقتي صدا زده ميشود كه ما گمان ميكنيم كاربر يك انسان است. اين تابع مقدار فيلد پنهان ما را از صفر به يك تغيير ميدهد.
– تابع setUpHumanTest در حقيقت تمام صفحه را بررسي ميكند و 2كنترل كننده جاوااسكريپت به فرم اضافه ميكند.
1– اگر فرم داراي focus بود (در حال انجام عمليات، در اينصورت تابع markAsHuman فراخوانده ميشود.)
2– اگر رويداد كليك اتفاق افتاد، باز تابع markAsHuman فراخوانده ميشود.
اين رويدادها فقط در صفحه مرورگر اتفاق ميافتد، بنابراين هرزنويسها يا كدها قادر به تغيير آن نخواهند بود.
3– با صدا زدن addEvent، تابع setUpHumanTest فراخوانده ميشود.
تست نتايج با اسكريپت
فرم شما به يك اسكريپت ديگر ارسال ميشود (كه اين اسكريپت معمولا PHP يا ASP است)، كافي است به اين اسكريپت بگوييد كه هر كجا كه imahuman صفر بود، فرم را در نظر نگيرد.
برخي از برنامهنويسان وانمود ميكنند كه اسكريپت كار ميكند و بات را به صفحه موفقيت آميز هم ميبرند، اما كاري كه قرار است را انجام نميدهند و هرزنويس را گول ميزنند. البته به عقيده من، اين كار باعث ميشود هرزنويس نسبت به توليد هرزنامه تشويق شود و بار اضافي روي سايت ايجاد كند.
مرد نامرئي هرزنامه نميپذيرد
آيا تابهحال به اين موضوع انديشيدهايد كه چطور ميتوانيد در مقابل هرزنامهها از فرمهاي وب خود محافظت كنيد؟
هيچكس دوست ندارد، موقع ورود يا ثبتنام يا استفاده از فرمهاي وب، يك مشت حرف كج و معوج ببيند، و آنها را داخل فيلد مورد نظر وارد كند، اما آيا راه بهتري هم هست؟
بله، و بيشتر مردم از چنين راهي براي جلوگيري از حملات هرزنامهها بيخبرند.
در بحثهايي كه براي جايگزيني CAPTCHA ميشود، نظريهاي است كه طبق آن، ميتوان با تشخيص رويدادهاي ماوس و يا فشرده شدن كليدها توسط جاوااسكريپت، از انسان بودن فرمپركننده مطلع شد.
در زير با كمك مثالي ساده، جانشيني براي CAPTCHA ايجاد مي گردد. اما پيش از آن، بايستي نكات زير را در نظر بگيريد.
1 – فرم شما بايد برخي از رويدادهايي كه دليل فعاليت انسانياند، ثبت كند.
2 – اگر جاوااسكريپت فعال نبود، بايد يك جايگزين سريع داشته باشيد.
3 – تمام اين آزمايشها تا حد امكان بايد از چشم كاربر دور بماند.
4 – براي روبوتها فهميدن و دور زدن آزمايشهاي شما، كار دشواري نيست.
آيا من انسانم؟
در ابتدا بايد راهي بيابيم كه فرم بتواند جواب سوال «آيا من انسانم؟» را به كد پشت صحنه بفرستد. بدين منظور، من از فيلد پنهان استفاده كردم. لازم بهذكر است، بر طبق نكات بالا، نام اين فيلد هر چيزي ميتواند باشد. اگر باتها اسم اين فيلد را بدانند، در اين صورت مدار صحيحي از طريق سيستم به آن پاس خواهند داد.
اين فيلد هرجايي ميتواند باشد، اما من قبل از بستن فروم ميگذارمش.
<input type="hidden" name="imahuman
/> " 0" id="imahuman" value="
</form>
كد فوق را ببينيد، مقدار اين فيلد بهطور پيشفرض صفر درنظر گرفته شده است، كه بهمعناي «خير، اين يك انسان نيست» است.
تغيير بهخاطر انسانها
در قطعه زير ميخواهيم وقتي رويداد خاصي اتفاق افتاد، مقدار imahuman را تغيير دهيم. تابعي كه تشخيص آن رويداد را انجام ميدهد، بايد توسط يك كنترلكننده رويداد (EventHandler) كنترل شود و آن كنترلكننده خود از طريق يك فايل خارجي جاوااسكريپت به فايل پيوست شود، مطمئن باشيد كه توي خود كد htmlتان چيزي نمينويسيد.
Set up//
addEvent(window, "load", setUpHumanTest, false);
function setUpHumanTest() {
var myforms = document.getElementsByTagName("form") ;
; i<myforms.length; i++) {0for (var i=
addEvent(myforms[i], "focus", markAsHuman, false);
addEvent(myforms[i], "click", markAsHuman, false);
}
}
function markAsHuman() {
";1document.getElementById("imahuman").value = "
}
var addEvent;
if (document.addEventListener) {
addEvent = function(element, type, handler) {
element.addEventListener(type, handler, null);
if (element.href) element.href="javascript:void('');" ;
{
{
else if (document.attachEvent) {
addEvent = function(element, type, handler) {
element.attachEvent("on" + type, handler);
if (element.href) element.href="javascript:void('');" ;
{
{
else {
addEvent = new Function;
}
حال از بالا به پايين آن را شرح ميدهيم.
– خط آخر به اين معني است كه كافي است يك دستور addEvent را اجرا كنيد و كار را تمام كنيد.
– تابع markAsHuman وقتي صدا زده ميشود كه ما گمان ميكنيم كاربر يك انسان است. اين تابع مقدار فيلد پنهان ما را از صفر به يك تغيير ميدهد.
– تابع setUpHumanTest در حقيقت تمام صفحه را بررسي ميكند و 2كنترل كننده جاوااسكريپت به فرم اضافه ميكند.
1– اگر فرم داراي focus بود (در حال انجام عمليات، در اينصورت تابع markAsHuman فراخوانده ميشود.)
2– اگر رويداد كليك اتفاق افتاد، باز تابع markAsHuman فراخوانده ميشود.
اين رويدادها فقط در صفحه مرورگر اتفاق ميافتد، بنابراين هرزنويسها يا كدها قادر به تغيير آن نخواهند بود.
3– با صدا زدن addEvent، تابع setUpHumanTest فراخوانده ميشود.
تست نتايج با اسكريپت
فرم شما به يك اسكريپت ديگر ارسال ميشود (كه اين اسكريپت معمولا PHP يا ASP است)، كافي است به اين اسكريپت بگوييد كه هر كجا كه imahuman صفر بود، فرم را در نظر نگيرد.
برخي از برنامهنويسان وانمود ميكنند كه اسكريپت كار ميكند و بات را به صفحه موفقيت آميز هم ميبرند، اما كاري كه قرار است را انجام نميدهند و هرزنويس را گول ميزنند. البته به عقيده من، اين كار باعث ميشود هرزنويس نسبت به توليد هرزنامه تشويق شود و بار اضافي روي سايت ايجاد كند.