2012-09-03 23 views
5

Tôi đang làm việc trên tập lệnh php, nơi tôi muốn xóa một số tệp khỏi thư mục đã cho bằng ký tự đại diện (*).
Tôi đã tìm thấy một số ví dụ hoạt động như this one, trong đó chức năng unlink()glob() được sử dụng.Xóa tệp bằng ký tự đại diện - exec và hủy liên kết

Bây giờ, tôi đã tự hỏi, nó cũng sẽ là ok để xóa các tập tin bằng cách sử dụng chức năng exec và một lệnh như rm -f /path/to/folder/_prefix_*?
Có bất kỳ rủi ro bảo mật nào được thực hiện bằng cách này không?
Và nếu nó là ok, nó sẽ là tốt hơn về hiệu suất?

EDIT:
Vì vậy, từ các câu trả lời đầu tiên tôi có thể thấy rằng thực sự, sử dụng exec có thể là một giải pháp có thể chấp nhận được.
Điều gì về vấn đề hiệu suất? Có khả năng tùy chọn exec có thể tốt hơn (nhanh hơn/ít đòi hỏi) hơn kỹ thuật glob/unlink không?

Cảm ơn bạn trước

+1

rm sẽ ổn, các vấn đề bảo mật tùy thuộc vào người có thể chạy tập lệnh. –

Trả lời

8

Bởi vì không có cơ hội cho dữ liệu người dùng cung cấp để được tiêm, không có vấn đề an ninh trong việc sử dụng exec qua glob/unlink. Tuy nhiên, sử dụng glob/unlink cho phép bạn xác định trường hợp ngoại lệ:

foreach(glob("delete/*") as $f) { 
    if($f == "delete/notme.txt") continue; 
    unlink($f); 
} 

exec thường bị vô hiệu hóa trên các máy chủ chia sẻ để glob/unlink là khả năng di chuyển. Nếu bạn có một thiết lập chuyên dụng và không có ý định từ bỏ nó, bạn không cần phải lo lắng về điều đó.

+0

Cảm ơn bạn đã trả lời Kolink. Tôi đang trên một máy chủ thuộc sở hữu, và exec được kích hoạt và làm việc tốt. Bạn có nghĩ rằng nó có thể tạo ra sự khác biệt về hiệu suất sử dụng một kỹ thuật khác không? – CrisDeBlonde

+0

Tôi sẽ tưởng tượng 'exec' nhanh hơn, nhưng' glob/unlink' cho phép kịch bản biết chính xác những gì đang diễn ra - hữu ích cho các ứng dụng giao diện điều khiển hơn là dựa trên web, nhưng bạn cũng có thể nhận được báo cáo lỗi cho mỗi tệp hoặc liệt kê các tệp đã xóa ... –

1

Cả hai tùy chọn đều có thể ổn. Tuy nhiên, nếu bạn không kiểm soát máy chủ của riêng bạn hoặc trên lưu trữ được chia sẻ, lệnh exec có thể không khả dụng.

Để ở bên lưu, sử dụng glob và hủy liên kết.

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