Tuyên bố từ chối; Tôi hoàn toàn nhận thức được những cạm bẫy và "tệ nạn" của eval, bao gồm nhưng không giới hạn: vấn đề hiệu suất, an ninh, tính di động, vvLỗi PHP và lỗi chụp (nhiều nhất có thể)
Vấn đề
Đọc hướng dẫn PHP trên eval .. .
eval() trả về NULL trừ khi lợi nhuận là gọi trong mã đánh giá, trong đó trường hợp giá trị thông qua để trở lại là trả lại. Nếu có lỗi phân tích cú pháp trong mã được đánh giá, eval() trả lại SAI và thực thi mã sau đây tiếp tục bình thường. Nó không phải là có thể bắt lỗi phân tích cú pháp trong eval() bằng cách sử dụng set_error_handler().
Tóm lại, không có lỗi chụp ngoại trừ trả về false rất hữu ích, nhưng tôi ei có thể làm tốt hơn!
Lý do
Một phần của chức năng của trang web tôi đang làm việc trên dựa vào thực hiện biểu thức. Tôi không muốn đi qua con đường của sandbox hoặc mô-đun thực hiện, vì vậy tôi đã kết thúc bằng cách sử dụng eval. Trước khi bạn hét lên "nếu khách hàng trở nên tồi tệ thì sao ?!" biết rằng khách hàng được tin tưởng khá nhiều; anh ta sẽ không muốn phá vỡ trang web của riêng mình, và bất cứ ai truy cập vào chức năng này sở hữu khá nhiều máy chủ, bất kể eval.
Khách hàng biết về các biểu thức như trong Excel, và nó không phải là một vấn đề giải thích sự khác biệt nhỏ, tuy nhiên, có một số hình thức cảnh báo là khá nhiều chức năng tiêu chuẩn.
Đây là những gì tôi có cho đến nay:
define('CR',chr(13));
define('LF',chr(10));
function test($cond=''){
$cond=trim($cond);
if($cond=='')return 'Success (condition was empty).'; $result=false;
$cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
try {
$success=eval($cond);
if($success===false)return 'Error: could not run expression.';
return 'Success (condition return '.($result?'true':'false').').';
}catch(Exception $e){
return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
}
}
Ghi chú
- Hàm trả về một chuỗi tin nhắn trong bất kỳ sự kiện
- Khái niệm mã nên được một mảnh single-line của PHP, không có thẻ PHP và không có dấu chấm phẩy kết thúc
- Dòng mới được chuyển đổi thành dấu cách
- Một biến được thêm vào để chứa kết quả (biểu hiện phải trả lại đúng hoặc sai, và để không mâu thuẫn với lợi nhuận eval, một biến temp được sử dụng.)
Vì vậy, những gì bạn sẽ thêm để tiếp tục trợ giúp người dùng? Có thêm chức năng phân tích cú pháp nào có thể xác định tốt hơn các lỗi/vấn đề có thể xảy ra không?
Chris.
nếu bạn có thể cung cấp thông tin phản hồi hơn về những gì "biểu thức", bạn sẽ sử dụng, có lẽ chúng ta có thể giúp hơn. Tôi có thể nghĩ ra một số thứ token_get_all tốt đẹp để xác thực người dùng nhập vào;) – NikiC
Mã PHP bình thường? Tôi dự định cho phép truy cập đầy đủ vào PHP, với ngoại lệ có thể là việc định nghĩa các hàm và các lớp, điều này không cần thiết. – Christian