2012-11-28 29 views
6

Tôi đang làm việc trên một drupal 7 cài đặt nơi arg (x)khử trùng/thoát ra khỏi drupal arg (x) cần thiết?

http://api.drupal.org/api/drupal/includes!bootstrap.inc/function/arg/7

đã được sử dụng trong sản lượng html rất nhiều, theo quan điểm của mẫu và những nơi khác, vv Mặc dù tôi đã xem xét các tài liệu và tìm kiếm xung quanh về chủ đề này, tôi vẫn còn bối rối nếu tôi cần phải khử trùng/thoát khỏi đầu ra của arg (x) với htmlspecialchars của php hoặc checkupplain của drupal vv để ngăn chặn xss.

Trả lời

3

Về mặt kỹ thuật, theo thử nghiệm của tôi, bạn cần để thoát khỏi nó. Nhưng mặt tốt là, arg() không sử dụng đầu vào người dùng trực tiếp luôn.

Nếu URL (hay chính xác hơn, $_GET['q']) là node/<h3>/edit, arg(1) lợi nhuận <h3> mà không có một đồng bằng séc. Nếu bạn muốn tự mình thử nghiệm, hãy thêm đoạn mã bên dưới và xem chính bạn.

<?php 
echo (arg(1, 'node/<h3>/edit')); ?>Normal text 

Bây giờ bạn sẽ thấy "Văn bản thông thường" trong h3.

Nếu nút có ID 4, khi xem nút, $_GET['q'] sẽ là nút/4. Nếu đường dẫn không được đặt bí danh, URL sẽ giống nhau. theo ví dụ trên, nếu người dùng mở node/<h3>, arg(1) sẽ là <h3> mà không thoát nhưng có nghi ngờ rằng người dùng sẽ thấy đoạn mã bạn sử dụng arg() vì trang đó trả về kết quả 404 (nơi bạn không thấy bất kỳ khối nào , nội dung trang, v.v.)

Sử dụng arg() trong t(), url(), l() và các chức năng khác sẽ luôn luôn thoát khỏi/khử trùng kết quả như vậy trong thế giới thực tế, nó không chắc rằng bạn sẽ tìm thấy một trường hợp thực tế mà ai đó có thể XSS trang web của bạn.

Đây là một cách sử dụng tồi tệ mà tôi có thể nghĩ đến. Trong file page.tpl.php, bạn có thể thêm một lớp từ đường dẫn URL như thế này:

<body class="<?php print arg(0); ?>"> 

Bạn có thể hy vọng rằng trên các trang nút, bạn sẽ thấy lớp cơ tag là "nút", và trên quản trị các trang, lớp học là "quản trị". Nhưng hãy tưởng tượng người dùng mở một trang như thế này:

http://example.com/" onclick="alert('You are clicking on me');" 

Vì vậy, HTML thực tế của thẻ cơ thể sẽ như thế này:

<body class="" onclick="alert('You are clicking on me');"> 

Bây giờ bạn sẽ thấy thẻ cơ thể có một thuộc tính lớp rỗng và cơ thể cũng có sự kiện onclick được thêm vào. Đây có thể là ví dụ tồi tệ nhất mà bạn có thể thấy - nhưng tôi chỉ muốn cho bạn thấy một số ví dụ thực sự. Sử dụng $node->nid là an toàn.

+0

cảm ơn bạn rất nhiều! Điều đó có nghĩa là tôi hiểu, thực sự đánh giá cao việc bạn dành thời gian để hỗ trợ. Có một ngày tuyệt vời. –

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