2008-10-06 37 views
9

Tôi muốn đảm bảo mọi người không thể nhập tên của tập lệnh PHP vào URL và chạy nó. Cách tốt nhất để làm điều này là gì?Cách tốt nhất để chỉ cho phép một tệp PHP được bao gồm là gì?

Tôi có thể đặt biến trong tệp sẽ bao gồm tệp này và sau đó kiểm tra biến đó trong tệp đang được đưa vào, nhưng có cách nào dễ hơn không?

+0

Bạn có thể làm rõ hơn không? Tôi thực sự không hiểu làm thế nào bạn muốn một tập tin không được chạy nếu bạn trỏ trình duyệt của bạn đến nó ... –

+0

Có thể nếu các hàm preforms hoạt động, có thể vì mục đích bảo mật, tại sao lại không liên quan. – UnkwnTech

+0

@Unkwntech: sự nhầm lẫn của tôi xuất phát từ thực tế là nếu một tệp nằm trong webroot, nó phải là để xem, bất cứ điều gì an toàn phải ở bên ngoài ... –

Trả lời

6

Bạn có thể kiểm tra các URI và xem nếu tập tin đó đã được gọi với `

$_SERVER['SCRIPT_FILENAME'] 

hoặc bạn có thể di chuyển các tập tin bên ngoài thư mục công cộng, đây là một giải pháp tốt hơn.

+1

Đây là câu trả lời tôi đang tìm kiếm, cảm ơn ... Tôi đồng ý rằng việc di chuyển tệp bên ngoài thư mục công khai thường tốt hơn, nhưng trong trường hợp của tôi Sẽ tốt hơn nếu sử dụng biến $ _SERVER đó. –

0

Zend Framework khuyên bạn nên giữ các tệp bên ngoài gốc web, như Unkwntech đã đề xuất. Tôi muốn nói đây là giải pháp chứng minh an toàn nhất và ngu ngốc nhất.

0

Từ một module PHP Nuke:

<?php 
if (!eregi("modules.php", $PHP_SELF)) { 
    die ("You can't access this file directly..."); 
} 
// more code ... 
?> 

Thay modules.php với tên tập tin của bạn, và tập tin mà không thể được gọi trực tiếp.

+0

Điều này đã lỗi thời. Đừng dùng cái này. – DanMan

+0

Nó chắc chắn đã lỗi thời, vì đây là từ 6 năm trước. Là PHPNuke vẫn còn xung quanh? – ThoriumBR

0

Một cách tôi đã nhìn thấy rất nhiều là để tạo ra một biến mà đã có mặt ở tất cả các tập tin bao gồm kiểm tra và điều đầu tiên trong mỗi bao gồm:

if(!isset($in_prog)){ 
exit; 
} 
4

tôi từ lâu đã giữ tất cả mọi thứ ngoại trừ kịch bản trực tiếp có thể xem bên ngoài gốc web. Sau đó cấu hình PHP để bao gồm thư mục script của bạn trong đường dẫn. Một tập hợp điển hình lên sẽ là:

appdir 
    include 
    html

Trong cấu hình PHP (hoặc PHP cấu hình toàn cầu hoặc trong một tập tin .htaccess trong thư mục html) thêm này:

include_path = ".:/path/to/appdir/include:/usr/share/php"

hoặc (dành cho Windows)

include_path = ".;c:\path\to\appdir\include;c:\php\includes"

Lưu ý rằng dòng này có thể đã có trong tệp php.ini của bạn, nhưng có thể được nhận xét cho phép các giá trị mặc định hoạt động. Nó cũng có thể bao gồm các đường dẫn khác. Hãy chắc chắn để giữ những người, là tốt.

Nếu bạn đang thêm nó vào một tập tin .htaccess, định dạng là:

php_value include_path .:/path/to/appdir/include:/usr/share/php

Cuối cùng, bạn có thể thêm đường dẫn programatically với một cái gì đó như thế này:

$parentPath = dirname(dirname(__FILE__)); 
$ourPath = $parentPath . DIRECTORY_SEPARATOR . 'include'; 

$includePath = ini_get('include_path'); 
$includePaths = explode(PATH_SEPARATOR, $includePath); 
// Put our path between 'current directory' and rest of search path 
if ($includePaths[0] == '.') { 
    array_shift($includePaths); 
} 

array_unshift($includePaths, '.', $ourPath); 
$includePath = implode(PATH_SEPARATOR, $includePaths); 
ini_set('include_path', $includePath); 

(Dựa trên mã hoạt động, nhưng đã được sửa đổi, do đó chưa được kiểm tra)

Điều này sẽ được chạy trong tệp giao diện người dùng của bạn (ví dụ: index.php). Tôi đặt nó trong một tập tin bao gồm riêng biệt, sau khi sửa đổi ở trên, có thể được bao gồm với một cái gì đó như #include '../includes/prepPath.inc'.

Tôi đã sử dụng tất cả các phiên bản tôi đã trình bày ở đây với thành công. Phương pháp cụ thể được sử dụng tùy thuộc vào sở thích và cách triển khai dự án.Nói cách khác, nếu bạn không thể sửa đổi php.ini, rõ ràng bạn không thể sử dụng phương thức đó

9

Trong một số ứng dụng nguồn mở mà tôi đã thu hút, bao gồm Joomla và PHPBB, chúng khai báo một hằng số trong chính bao gồm tập tin, và sau đó xác minh liên tục tồn tại trong mỗi người trong số này bao gồm:

// index.php 
require_once 'includes.php'; 

// includes.php 
define('IN_MY_PROJECT', true); 
include 'myInc.php'; 

// myInc.php 
defined('IN_MY_PROJECT') || die("No direct access, plsktnxbai"); 
0

tôi đoán cách tốt nhất là đưa các tập tin bạn muốn bao gồm trong "/include" thư mục và đặt quyền truy cập 700 đến thư mục

Các vấn đề liên quan