2010-02-25 30 views
8

Tôi biết nên tránh eval trong JavaScript vì lý do tốc độ và bảo mật. Nhưng trong trường hợp của PHP, hiếm khi là an ninh từng được đề cập. Thường xuyên hơn, chương trình của bạn chạy chậm hơn vì chương trình sử dụng hóm hỉnh eval.Tình huống nào yêu cầu sử dụng eval() vì không có lựa chọn thay thế?

Trong trường hợp cụ thể nào bạn nên sử dụng eval vì không có cách nào khác xung quanh?

Để rõ ràng:

Chúng tôi không nói về dữ liệu do người dùng cung cấp. Vì vậy, câu hỏi được tập trung vào việc sử dụng hợp lệ phía máy chủ thuần túy và được kiểm soát hoàn toàn là eval.

Trả lời

0

tôi biết eval nên tránh trong javascript để biết tốc độ và bảo mật lý do. nhưng trong trường hợp của php, hiếm khi được bảo mật bao giờ được đề cập. thường xuyên hơn, chương trình của bạn chạy chậm hơn so với việc sử dụng evalngẫu nhiên khi sử dụng eval.

evalevil trong php quá.

trong trường hợp cụ thể nào bạn nên sử dụng eval() vì không có cách nào khác cách xung quanh?

Trước hết, chúng tôi cố gắng tránh nó càng nhiều càng tốt, nhưng nếu bạn phải sử dụng để thực hiện một số mã, sau đó bạn sẽ phải đi với điều đó nhưng như đã nói nó là ác, bạn sử dụng tại rủi ro của riêng mình.

Bottom Line:

bao giờ cho phép ở mức nào, người dùng nhập vào để được chạy với eval. (Trừ khi bạn biết những gì bạn đang làm/rủi ro)

+0

OP không nói đó là dữ liệu do người dùng cung cấp, mà bài viết đó dựa trên đối số (rất ngắn gọn) của nó. Anh hỏi liệu có bất kỳ tình huống hợp lệ nào để sử dụng nó không. Rõ ràng, việc sử dụng 'eval' trên ata do người dùng cung cấp không hợp lệ, nhưng điều đó không thực sự trả lời câu hỏi. –

+0

@Crowder: ông nói "tôi biết eval nên tránh trong javascript vì lý do tốc độ và bảo mật. Nhưng trong trường hợp của php, hiếm khi là bảo mật bao giờ được đề cập." Giả sử nó không được đề cập đến là ác trong php :) Tôi cũng đã thảo luận về tình hình/sử dụng một phần. Cảm ơn – Sarfraz

10

Các vấn đề bảo mật của mã sốvới eval trong PHP cũng giống như trong Javascript: nếu bạn đánh giá một số mã, bạn phải chắc chắn nó ở đâu đến từ, và những gì nó chứa.

Các tác động bảo mật thậm chí có thể lớn hơn, vì PHP có quyền truy cập vào cơ sở dữ liệu của bạn (trong số những thứ khác) - có nghĩa là nó có thể được sử dụng để ăn cắp/hỏng gần như thông tin avery ứng dụng của bạn dựa vào!

Trong Javascript, họ nói rằng "eval là số ác"; nó có thể là đúng trong PHP là nó đúng trong Javascript.


Bây giờ, về các tình huống cụ thể mà bạn không thể tránh sử dụng eval ...Vâng, trong một cái gì đó giống như 4 năm phát triển trong PHP như là công việc hàng ngày của tôi, tôi không nhớ đã từng sử dụng eval trong mã của riêng mình ^^

Tuy nhiên, và ví dụ về trường hợp bạn cần eval sẽ là khi bạn đang lưu trữ một số mã trong cơ sở dữ liệu, ví dụ, và không lưu nó trong các tệp (có thể được bao gồm) - điều đó xảy ra với một số CMS cho phép các phần mã PHP được nhập vào phần quản trị, chẳng hạn.

+0

Hoàn toàn đồng ý. Tôi sẽ cẩn thận hơn với PHP eval hơn js eval, và tôi không thể nhớ lại một ví dụ mà tôi cần nó. –

+4

+1 Tôi sẽ nói rằng nó là ** chắc chắn hơn ác trong PHP ** hơn trong JavaScript vì đĩa, cơ sở dữ liệu và truy cập mạng tùy ý. –

0

tôi hoàn toàn đồng ý với các câu trả lời trước đó ở điểm eval là xấu và tôi không bao giờ sử dụng nó trong mã của mình.

nhưng trong một trường hợp tôi chưa quản lý để tránh eval. tôi không có nhiều kinh nghiệm trong php, vì vậy tôi sẽ được vui mừng nếu có ai đó tư vấn cho tôi như thế nào tôi có thể viết lại mã mà không có 'eval'. tình huống đó tôi đã có một tên lớp được lưu trữ trong một biến, và tôi đã phải gọi một phương thức tĩnh trên lớp đó, classname đến từ một nguồn đáng tin cậy. vì vậy tôi phải viết một cái gì đó như thế này:

eval("\$result = $className::methodName()"); 

(vì bạn không thể chỉ viết $ className :: methodName());

+0

'call_user_func (mảng ($ className, 'methodName'))' hoặc 'call_user_func (" $ className :: methodName ")', tùy thuộc vào phiên bản PHP của bạn. – Matthew

+0

call_user_func (mảng ($ className, $ methodName)); nên làm việc. EDIT: konforce đã vào trước tôi :) – Jimmeh

+0

có cùng một vấn đề với bảo mật, nhưng hiệu suất tốt hơn ... không biết tại sao tôi không nghĩ đến việc sử dụng điều đó) – kipelovets

0

Nếu bạn muốn sử dụng các chức năng ẩn danh trước PHP 5.3, bạn cần sử dụng create_function, bao gồm lệnh gọi eval().

2

Đánh giá và tạo_function có thể cho phép tiêm mã đơn vị. Có rất nhiều thứ trong PHP có thể được sử dụng để thỏa hiệp sự an toàn của ứng dụng của bạn.

Chúng tôi bảo trẻ không chơi với dao và các trận đấu - nhưng đây là những công cụ hữu ích (nếu không cần thiết) khi được sử dụng đúng cách. Vì vậy, nó có rất nhiều chức năng của PHP. Không có gì sai về bản chất khi sử dụng chức năng miễn là bạn hiểu chính xác những gì bạn đang làm.

Nhưng một cuộc thảo luận về ngôn ngữ lập trình ở mức trừu tượng như vậy không phải là những gì StackOverflow là về.

C.

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