Khi thêm người dùng mới, chuỗi được xác thực như thế nào?
Tôi cho rằng có một biểu thức chính quy. Biểu hiện thường xuyên đó là gì?
Khi thêm người dùng mới, chuỗi được xác thực như thế nào?
Tôi cho rằng có một biểu thức chính quy. Biểu hiện thường xuyên đó là gì?
Câu trả lời:
Nguyên tắc chung cho tên người dùng là độ dài của nó phải dưới 32 ký tự. Nó phụ thuộc vào phân phối của bạn để tạo tên người dùng hợp lệ.
Trong Debian, shadow-utils 4.1
có một is_valid_name
chức năng trong chkname.c
:
static bool is_valid_name (const char *name)
{
/*
* User/group names must match [a-z_][a-z0-9_-]*[$]
*/
if (('\0' == *name) ||
!((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
return false;
}
while ('\0' != *++name) {
if (!(( ('a' <= *name) && ('z' >= *name) ) ||
( ('0' <= *name) && ('9' >= *name) ) ||
('_' == *name) ||
('-' == *name) ||
( ('$' == *name) && ('\0' == *(name + 1)) )
)) {
return false;
}
}
return true;
}
Và độ dài của tên người dùng đã được kiểm tra trước:
bool is_valid_user_name (const char *name)
{
/*
* User names are limited by whatever utmp can
* handle.
*/
if (strlen (name) > USER_NAME_MAX_LENGTH) {
return false;
}
return is_valid_name (name);
}
Từ trang man của useradd (8) :
Thông thường chỉ nên sử dụng tên người dùng bắt đầu bằng chữ in thường hoặc gạch dưới, tiếp theo là chữ thường, chữ số, dấu gạch dưới hoặc dấu gạch ngang. Họ có thể kết thúc với một ký hiệu đô la. Trong thuật ngữ biểu thức chính quy: [a-z _] [a-z0-9 _-] * [$]?
Trên Debian, các ràng buộc duy nhất là tên người dùng không được bắt đầu bằng dấu gạch ngang ('-') cũng không chứa dấu hai chấm (':') hoặc khoảng trắng (dấu cách: '', cuối dòng: '\ n', lập bảng: ' \ t ', v.v.). Lưu ý rằng việc sử dụng dấu gạch chéo ('/') có thể phá vỡ thuật toán mặc định cho định nghĩa của thư mục chính của người dùng.
Tên người dùng chỉ có thể dài tối đa 32 ký tự.
Vì vậy, có một khuyến nghị chung. Các ràng buộc thực tế phụ thuộc vào chi tiết cụ thể của việc triển khai / phân phối của bạn. Trên các hệ thống dựa trên Debian, rõ ràng không có ràng buộc nào quá khó khăn. Trên thực tế, tôi vừa thử useradd '€'
trên hộp Ubuntu của mình và nó đã hoạt động. Tất nhiên, điều này có thể phá vỡ một số ứng dụng không mong đợi tên người dùng bất thường như vậy. Để tránh những vấn đề như vậy, tốt nhất là làm theo khuyến nghị chung.
Xin lỗi vì đã ghi lại câu hỏi gần 4 năm tuổi này, nhưng nó xuất hiện khá cao trên kết quả tìm kiếm trên Internet và nó đảm bảo sự chú ý hơn một chút.
Một regex chính xác hơn là (vâng, tôi biết, mặc dù trang nam):
^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$
Hy vọng rằng sẽ giúp một số người tìm kiếm.
Để phá vỡ nó:
^
) chỉ với các chữ cái viết thường hoặc dấu gạch dưới ( [a-z_]
). Điều này chiếm chính xác 1 ký tự.( ... )
):
{0,31}
) của các chữ cái , số , dấu gạch dưới và / hoặc dấu gạch nối ( [a-z0-9_-]
), OR ( |
)\$
) ở cuối và sau đó$
).Đối với những người không quen thuộc với các mẫu biểu thức chính quy, bạn có thể hỏi tại sao ký hiệu đô la có dấu gạch chéo ngược trong 2.2. nhưng không ở 3. Điều này là do trong hầu hết các biến thể regex (tất cả?), ký hiệu đô la biểu thị sự kết thúc của một chuỗi (hoặc dòng, v.v.). Tùy thuộc vào công cụ đang được sử dụng, nó sẽ cần phải được thoát nếu đó là một phần của chuỗi thực tế (tôi không thể nghĩ ra khỏi đỉnh đầu của một công cụ regex không sử dụng dấu gạch chéo như một lối thoát cho biểu thức thuần túy) .
Lưu ý rằng Debian và Ubuntu loại bỏ một số hạn chế đối với tên người dùng tuân thủ hoàn toàn POSIX / bóng tối (ví dụ: và tôi không biết điều này đã được sửa chưa, nhưng chúng cho phép tên người dùng bắt đầu bằng một số - thực sự là nguyên nhân gây ra điều này lỗi ). Nếu bạn muốn đảm bảo đa nền tảng, tôi khuyên bạn nên sử dụng mẫu regex ở trên thay vì những gì vượt qua / không kiểm tra trong Debian, Ubuntu và các thứ khác.
[abcdefghijklmnopqrstuvwxyz]
thay vì [a-z]
. [a-z]
trong nhiều công cụ regrec cũng phù hợp với những thứ như é
, œ
hoặc thậm chí đôi khi các yếu tố đối chiếu nhiều ký tự như dsz
ở các địa phương Hungary.
java.util.regex.Pattern.matches("^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\\$)$", user);