2012-07-20 29 views
6

Trong "Lập trình Perl" -w điều hành tập tin thử nghiệm được mô tả như sau:Tại sao toán tử kiểm tra tệp không hoạt động (Perl)?

-w file là có thể ghi bởi UID hiệu quả/GID.

Tôi có hai tập tin:

-rwsrwxrwx 1 testuser testuser 226 Jul 20 20:31 script.pl 
-rw-rw-r-- 1 testuser testuser 34 Jul 14 17:24 file.txt 

suid được thiết lập trên script.pl, vì vậy khi tôi chạy nó như là người dùng Caligula, UID hiệu quả/GID nên một của testuser. script.pl là:

#!/usr/bin/perl 
use v5.14; 
if (-w 'file.txt') { 
    say "true"; 
} 
else { 
    say "false"; 
} 

Nhưng khi tôi chạy nó [email protected]:~$ ./script.pl đầu ra luôn là false. Tại sao điều đó xảy ra, có thể tôi không hiểu cách sử dụng chính xác của toán tử đó?

Đánh giá cao của tôi.

+1

FYI: Perl 5.16.0 là bây giờ có sẵn, mặc dù đó có thể là tin cũ cho tất cả mọi người nhưng tôi kể từ những ngày gần đây nhất trong bóng tar là 2012-05-20 vì vậy nó đã được đóng gói về sau đó. –

Trả lời

11

Perl có thể được định cấu hình để các tập lệnh SUID bị bỏ qua; nó là mặc định và có khả năng cách thiết lập của bạn. Bạn nên in UID thực và hiệu quả và GID trong tập lệnh.

Bạn có thể xác nhận này cụ thể với một cách khiêm tốn che khuất Perl one-liner:

$ perl -MConfig -e 'foreach $key (keys %Config) { print "$key = $Config{$key}\n"; }' | 
> grep -i -e 'se*t*[ug]id' 
d_dosuid = 
d_setresgid = define 
d_setresuid = define 
d_suidsafe = 
$ 

Hoặc, hơi ít obscurely bây giờ tôi đã tìm thấy đúng tên:

$ perl -MConfig -e 'print "d_suidsafe = $Config{d_suidsafe}\n"' 
d_suidsafe = 
$ 

Điều này cho thấy rằng điều này Perl (một 5.12.1 mà tôi xây dựng) không coi kịch bản SUID là an toàn.

Người dùng và ID nhóm giá trị thực và hiệu quả là phải báo cáo với: RUID $<, euid $>, RGID $( và EGID $), hoặc (hợp lý hơn) sử dụng tiếng Anh:

#!/usr/bin/env perl 
use English '-no_match_vars'; 
print "EUID = $EUID; RUID = $UID; EGID = $EGID; RGID = $RGID\n"; 
+4

'perl -V: '. * Se * t * [ug] id. *'' /// 'perl -V: d_suidsafe' – ikegami

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