ลวง 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['REQUEST_URI'])): ?> <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 ได้