• August 26, 2018

    ลวง path

    (แต่ถ้ารู้ ตำแหน่งไฟล์ก็เข้าตรงได้)
    mod_rewrite
    แปลงจากตำแหน่งจริง
    /video/uid5/video11.fla

    ไปเป็นตำแหน่งปลอม
    /vdo/5-21-videoname.fla

    ใช้ header น่ะครับ ซ่อน

    เวลา เขากด ดาวน์โหลด ก็จะเห็นเป็น url ที่เรากำหนดไว้ ไม่ได้ ลิงค์ไปที่ไฟล์ดาวน์โหลดโดยตรงเลย

    วิธีการป้องกัน โปรแกรมช่วยโหลด ที่จะมาดูด คลิป VDO จากเว็บเรา

    เว็บ http://www.pingbook.com/
    โปรแกรม IDM ที่เครื่องไม่ปรากฏปุ่มให้ดาวน์โหลด
    ปกติถ้าเป็นเว็บ youtube โปรแกรม IDM จะทำงานทันที
    เขามีเทคนิดการทำแบบไหน
    ปล.pingbook ก็สามารถดาวน์โหลดได้ครับ แต่ก็ยากหน่อย

    ใช้การเรียกจาก id ของ path

    <EMBED SRC=”source.php?id=xxxx”>

    <?
    	$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
    	$objDB = mysql_select_db("mydatabase");
    	$strSQL = "SELECT * FROM files WHERE FilesID = '".$_GET["id"]."' ";
    	$objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
    	$objResult = mysql_fetch_array($objQuery);
    
    	// $objResult["Path"];
    	readfile($objResult["Path"]);
    ?>
    
    หรือ hotlink
    RewriteEngine on 
    RewriteCond %{HTTP_REFERER} !^http://picohosting.com.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://www.picohosting.com.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://picohosting.com:80.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://www.picohosting.com:80.*$ [NC] 
    RewriteRule .*[Jj][Pp][Gg]$|.*[Gg][Ii][Ff]$|.*[Pp][Nn][Gg]$ http://www.picohosting.com/hotlink.html

    หรือ streaming server

    แสดงภาพผ่านไฟลแทนการเปิดดูภาพโดยตรง
    เช่น มีไฟลภาพurl http://localhost/test.jpg ไม่สามารถเปิดแสดงโดยตรงได้แต่ต้องเปิดผ่านไฟล์ php เช่น http://localhost/openimage.php?url=test.jpg

    hotlink

    RewriteEngine on 
    RewriteCond %{HTTP_REFERER} !^http://picohosting.com.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://www.picohosting.com.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://picohosting.com:80.*$ [NC] 
    RewriteCond %{HTTP_REFERER} !^http://www.picohosting.com:80.*$ [NC] 
    RewriteRule .*[Jj][Pp][Gg]$|.*[Gg][Ii][Ff]$|.*[Pp][Nn][Gg]$ http://www.picohosting.com/hotlink.html

    ป้องกัน การเข้า file โดยตรง เช่น form.php
    อาจจะให้หน้า form สร้าง dynamic hidden input สักตัวหนึ่งว่าส่งมาจากฟอร์มเราจริงรึเปล่า
    โดยข้อมูลตัวนี้อาจจะเข้ารหัสไว้ด้วย mcrypt + base64 ไว้
    พอหน้า query ก็ตรวจสอบก่อนว่าตรงตามที่เราเซ็ตไว้รึเปล่า ถ้าไม่ใช่ ก็ die(); ไปเลย

    การป้องกันการเข้าหน้า formquery.php โดยตรงน่าจะเช็คได้โดยเช็ค $_SERVER[‘HTTP_REFERER’]

    <?PHP
    $ref = $_SERVER['HTTP_REFERER'];
    if($ref == 'http://127.0.0.1/form.php'){
    //ทำการบันท฿กลงฐานข้อมูล
    } else { //ถ้าไม่ใช่ก็ให้เด้งกลับไปหน้า index 
    header('location:index.php'); 
    }
    ?>
    
    ป้องกันการกด Refresh เพื่อการคีข้อมูลซ้ำ
    (JavaScript)
    $("form").submit(function(){
         $("input[type=submit]").attr("disabled",true);
    });
    
    ใช้วิธี include ไฟล์ที่ใช้บันทึกข้อมูลไปอีกไฟล์
    1. form.php
    2. formquery.php
    3. form_action.php <-- เพิ่มไฟล์นี้เข้าไปเพื่อรับค่า form.php

    form_action.php

    <?php
    define('BASEPATH', "test');
    include("formquery.php");
    //เรียกฟังก์ชั่นบันทึกข้อมูล
    ?>

    formquery.php

    <?php
    if (!defined('BASEPATH')) exit('No direct script access allowed');   // เพิ่มบรรทัดนี้
    //Code...
    ?>
    

    อยากจะทำให้เรียกไฟล์ embed.php ได้เฉพาะผ่านการ include จากอีกไฟล์เท่านั้น
    และห้ามเรียกไฟล์นี้โดยตรงเช่น domain/embed.php

    เช่น ไฟล์ index.php
    จะมีโค้ด include(“embed.php”); เอาไว้เรียกไฟล์นี้เข้ามาแทรกไว้ในหน้า

    คำถามคือ
    จะมีวิธีป้องกัน ไม่ให้ user เรียก embed.php โดยตรงได้มั้ยครับ ?

    ใช้ session ในการตรวจสอบ
    http://www.thaicreate.com/php/forum/055093.html

    ขอบคุณครับ ที่แนะนำ.. แต่ผมไม่ได้ตั้งใจจะจัดการไฟล์ด้วย session น่ะครับ เพราะวัตถุประสงค์ของโปรแกรมมันไม่ใช่อย่างนั้น..
    แต่อย่างไรก็ตามผมก็หาวิธีการได้ล่ะครับ สืบเนื่องจากผมต้องทำ url friendly ด้วย

    ดังนั้น url ที่ปรากฎด้านบน ก็จะต้องไม่ใช่ชื่อไฟล์ของมันเองอยู่แล้ว
    เลยใช้ตัวแปรที่ผ่านมาจากการคัดกรองจาก htaccess
    (http://www.thaiseoboard.com/index.php/topic,16784.0.html )
    มาเช็คในการแสดงผล

    file1.php (main)

    <p>This is content on file1.php</p>
    <hr />
    <?php include("file2.php"); ?>

    file2.php (include)

    <?php if (!preg_match("/file2.php/",$_SERVER[&#39;REQUEST_URI&#39;])): ?>
    <p>This is content on file2.php</p>
    <hr />
    <?php endif; ?>

    หรือ

    ย้ายไฟล์ขึ้นไปเหนือ public_html

    แล้วเวลา include เข้ามา แต่โครงสร้างไฟล์มันจะแปลกๆ
    เป็นมาตรฐานเบื้องต้นของความปลอดภัย ทำให้เรียกไฟล์จากเว็บไม่ได้  สคริปที่ผมซื้อมาหลายๆตัวเค้าบอกไว้ว่าถ้าอยากให้ระบบปลอดภัยให้ย้าย folder สำคัญอยู่ สูงกว่า www,public_html ให้หมด

    หรือ

    ในไฟล์ index.php สร้าง define  ขึ้นมา 1 ค่า

    define('_PRIVATE_INCLUDE','loaded');

    ในไฟล์ enable.php ใส่โค๊ดไว้บนสุด

    if( !defined("_PRIVATE_INCLUDE") or _PRIVATE_INCLUDE != 'loaded' ) die("Permission denied...");
    

    ข้างในเงื่อนไขอาจจะทำ Redirect ก็ได้ พัฒนาต่อตามความต้องการ

    Lock File ไม่ให้คนอื่นมาอ่านหรือเขียน

    การ lock file ใน php ทำเพื่อป้องกันไม่ให้คนอื่นมาอ่านหรือเขียน ในขณะที่เรากำลังอ่านหรือเขียนอยู่
    จะใช้ function ที่ชื่อว่า flock ตัว flock จะเป็นตัวจัดการว่ามีคนอ่านหรือเขียน file นี้อยู่หรือไม่
    ประโยชน์ของมันคือการเขียนทีละครั้งจะทำให้ข้อมูลไม่เกิดข้อผิดพลาดกรณีที่ write 2 ตัวพร้อมกันและข้อมูลไม่เหมือนกัน
    แต่โทษของมันคือการ deadlock คือหากเราลืม unlock หรือไปไม่ถึงขั้นนั้นจะทำให้คนอื่นๆเขียนไม่ได้เช่นกันครับ

    รูปแบบ Function flock()

    boolean flock(file_resource handler,int operation,int &wouldblock);
    • file_resurce คือตัวแปรที่มาจาก fopen
    • operation จะเป็นค่าคงตัวซึ่งเค้ากำหนดมาดังนี้
      LOCK_SH คือ ไม่ให้คนอื่นอ่าน
      LOCK_EX คือ ไม่ให้คนอื่นเขียน
      LOCK_UN คือปลดล็อค (แต่ถ้าใช้ lock ผมว่ามันกันได้ทั้งอ่านและเขียน)
      LOCK_NB คือบอกว่าไม่อนุญาติให้คนอื่นใช้งานตอนล็อคอยู่ทันที(ถ้าไม่ใส่ตัวนี้ คนอื่นจะรอจนกว่าจะ unlock ถึงจะอ่านเขียนได้ แต่ถ้าใส่จะ return false ทันที
    • wouldblock ไม่ทราบ ผมไม่ใช้

    return ค่าเป็น true หากล็อคได้ และ false ถเาล็อคไม่ได้

    ตัวอย่างการใช้

    <?php 
    $fp = fopen("lock.txt", "w+");
    if (flock($fp, LOCK_EX | LOCK_NB )) { 
    ftruncate($fp, 0); // truncate file 
    fwrite($fp, "Write heren aaa adsasd \n"); 
    fflush($fp); // flush output before releasing the lock 
    sleep(10); 
    flock($fp, LOCK_UN | LOCK_NB ); // release the lock 
    } else { 
    echo "Couldn't get the lock!"; 
    } 
    fclose($fp); 
    ?>

    จาก code นี้ถ้าสั่งเรียก file นี้ 2 ครั้งติดๆกันจะเห็นว่าครั้งที่ 2 จะขึ้นว่าไม่สามารถ lock ได้



เวอไนน์ไอคอร์ส

ประหยัดเวลากว่า 100 เท่า!






เวอไนน์เว็บไซต์⚡️
สร้างเว็บไซต์ ดูแลเว็บไซต์

Categories