2008-09-03 38 views
28

Tôi đang cố viết một trang gọi PHP được lưu trữ trong cơ sở dữ liệu MySQL. Trang được lưu trữ trong cơ sở dữ liệu MySQL chứa mã PHP (và HTML) mà tôi muốn chạy khi tải trang.Làm cách nào để thực thi PHP được lưu trữ trong cơ sở dữ liệu MySQL?

Làm cách nào để tôi thực hiện việc này?

+8

Cảm ơn câu hỏi này. Trái ngược với nhiều "câu trả lời" dưới đây, đây là một câu trả lời hay và hữu ích. Có rất nhiều cách sử dụng LEGIT nơi bạn muốn lưu trữ các lệnh PHP trong một DB. Để nói "đừng làm điều đó" mà không biết hoàn cảnh chỉ là kiêu ngạo. –

Trả lời

30

Bạn có thể sử dụng lệnh eval cho việc này. Tôi sẽ khuyên bạn nên chống lại điều này mặc dù, bởi vì có rất nhiều cạm bẫy bằng cách sử dụng phương pháp này. Gỡ lỗi là khó (er), nó ngụ ý một số rủi ro bảo mật (nội dung xấu trong DB được thực hiện, uh oh).

Ví dụ: When is eval evil in php?. Google for Eval là Evil và bạn sẽ tìm thấy rất nhiều ví dụ tại sao bạn nên tìm một giải pháp khác.

Ngoài ra: Một bài viết hay khác có một số tham chiếu đến khai thác là this blogpost. Đề cập đến quá khứ và khai thác phpMyAdmin đã được gây ra bởi việc sử dụng Eval không đúng.

+0

trích đoạn từ "Eval is evil": "Cho phép mọi dữ liệu do người dùng cung cấp để thực hiện cuộc gọi eval() được yêu cầu bị tấn công". - OK, nếu tôi sử dụng mã của riêng mình được lưu trữ trong DB và được sử dụng, ví dụ: để tạo biểu mẫu tùy chỉnh động và nhanh chóng? – Jeffz

+0

@ Jeffz bạn nên chắc chắn rằng không có mã xấu nào kết thúc tại đó. Bên cạnh đó, tại sao bạn sẽ dính nó vào một cơ sở dữ liệu chứ không chỉ trong một vài tệp mã? –

+0

cả hai cách đều tốt, nếu bạn biết mình đang làm gì; [A]. tập tin dựa trên là an toàn hơn (đặc biệt là cho khá mới để mã hóa), [B]. Cách db là linh hoạt hơn, nếu một số thay đổi trên chuyến bay thành mã là cần thiết khi cập nhật db dễ dàng hơn việc cập nhật, tinh chỉnh (bất kỳ) nội dung nào của một tệp – Jeffz

2

Bạn có thể xem hàm eval trong PHP. Nó cho phép bạn chạy mã PHP tùy ý. Nó có thể là một nguy cơ bảo mật rất lớn, mặc dù, và tốt nhất là tránh.

5

eval() chức năng được đề cập trong các phản hồi khác tại đây. Tôi đồng ý bạn nên hạn chế sử dụng eval trừ khi nó là hoàn toàn cần thiết. Thay vì có mã PHP trong db, bạn có thể chỉ có một tên lớp có phương thức gọi là, execute(). Bất cứ khi nào bạn cần chạy mã PHP tùy chỉnh của bạn, chỉ cần khởi tạo lớp tên bạn vừa lấy từ db và chạy ->execute() trên đó. Đó là giải pháp sạch hơn và mang lại cho bạn một lĩnh vực linh hoạt tuyệt vời và cải thiện đáng kể bảo mật trang web.

1

Bạn đã cân nhắc sử dụng hệ thống Kiểm soát nguồn của mình để lưu trữ các nhánh khác nhau cho các cài đặt khác nhau (và các mô-đun khác nhau giữa chúng)? Đó sẽ là một trong những cách thực hành tốt nhất cho cấu hình ứng dụng mà tôi có thể nghĩ đến. Của bạn không phải là một yêu cầu bất thường, vì vậy đó là một vấn đề đã được giải quyết bởi những người khác trong quá khứ; và lưu trữ mã trong một cơ sở dữ liệu là một trong những tôi nghĩ rằng bạn sẽ có một thời gian khó tìm tài liệu tham khảo, hoặc được tư vấn như là một thực hành tốt nhất.

Điều tốt bạn đã đăng làm rõ. Có thể bạn đã vô tình đặt ra một câu trả lời để tìm kiếm một câu hỏi phù hợp.

22

dễ dàng:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

Hãy cho tôi biết, hoạt động tuyệt vời đối với tôi trong các ứng dụng NHIỀU, không thể giúp đỡ, nhưng nhận thấy rằng tất cả mọi người là nhanh chóng để nói như thế nào xấu nó được, nhưng chậm để thực sự giúp đỡ với một câu trả lời thẳng ...

+1

Tôi đã khắc phục sự cố của bạn - nếu bạn không thụt lề mã bốn dấu cách, '' được coi là thẻ HTML và bị ẩn – dbr

+1

+1 Giải pháp này thực tế hoạt động. Chỉ cần áp dụng eval ($ x) là KHÔNG giải quyết vấn đề vì nó phá vỡ mã tại dấu "<". Vì vậy, câu trả lời này giải quyết được vấn đề. Chúc mừng cho Gapp! – Devner

0

Cách tôi thực hiện việc này là có một trường trong cơ sở dữ liệu xác định một điều gì đó độc đáo về khối mã cần được thực thi. Một từ trong tên tệp của mã đó. Tôi đặt các chuỗi lại với nhau để trỏ đến tệp php cần được đưa vào. ví dụ:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

Bằng cách này, ngay cả khi tin tặc có thể truy cập DB, bạn không thể đưa mã độc vào thẳng để thực thi. Có lẽ anh ta có thể thay đổi từ tham chiếu, nhưng trừ khi anh ta thực sự có thể đặt một tập tin trực tiếp lên máy chủ, nó sẽ làm anh ta không tốt. Nếu anh ta có thể đặt các tập tin trực tiếp lên máy chủ, thì bạn sẽ bị chìm sau đó nếu anh ta thực sự muốn trở nên khó chịu. Chỉ cần hai xu của tôi có giá trị.

Và có, có những lý do bạn muốn thực thi mã được lưu trữ, nhưng có khuyết điểm.

+1

Tuyên bố của bạn rằng phương pháp đưa vào này là an toàn ngay cả khi tin tặc có thể truy cập DB của bạn không chính xác. Nó vẫn còn dễ bị tổn thương với một số khai thác bao gồm cả một được gọi là "null byte ngộ độc" hoặc "null byte tiêm" mà hiệu quả có thể loại bỏ (bỏ qua) kết thúc của chuỗi của bạn. Xem [tại đây] (https://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/) và [tại đây] (http://webcache.googleusercontent.com/search?q = cache: www.madirish.net/401) để biết thêm chi tiết. –

0

Đọc mã php từ cơ sở dữ liệu và lưu vào tệp với tên duy nhất và sau đó bao gồm tệp cách dễ dàng này để chạy mã php và gỡ lỗi.

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid; 
Các vấn đề liên quan