2009-10-19 35 views
12

Tôi có một trang web bằng php bao gồm() để nhúng nội dung vào một mẫu. Trang tải được đưa ra trong tham số get, tôi thêm ".php" vào cuối tham số và bao gồm trang đó. Tôi cần phải làm một số kiểm tra an ninh để tránh XSS hoặc các công cụ khác (không mysql tiêm vì chúng tôi không có một cơ sở dữ liệu). Những gì tôi đã đưa ra là sau đây.

$page = $_GET['page']; 

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || 
    !strpos($page, '\\') || !strpos($page, '..')) { 
     //append ".php" to $page and include the page 

Có điều gì khác tôi có thể làm để tiếp tục làm vệ sinh đầu vào của mình không?

+4

Không kiểm tra kết quả của strpos() như thế - nó sẽ trả về 0 nếu kết quả là ở đầu chuỗi, sẽ đánh giá false –

+0

@Tom, giải pháp acceppted cho phép tôi cũng tránh điều đó, dù sao, tôi sẽ nhớ lời khuyên của bạn cho mã tương lai. –

+0

Xem thêm: http://stackoverflow.com/a/15825812/59087 –

Trả lời

27
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

Có lẽ là cách nhanh nhất để khử trùng này, điều này sẽ mất bất cứ điều gì và chắc chắn rằng nó chỉ chứa chữ cái, số, gạch dưới hoặc dấu gạch ngang.

+1

vẫn có thể tấn công bằng mã hex: xem http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to- ngăn chặn-sql-injection/12202218 # 12202218 và cũng http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

cả hai liên kết đều về mysql và cái này câu hỏi không phải là về tiêm sql – NikkyD

3

Xác định danh sách các trang bạn có trong mã nguồn của bạn và sau đó sử dụng nó để kiểm tra đầu vào. Vâng, đó là công việc nhiều hơn, nhưng nó làm cho nó rất rõ ràng những gì được cho phép và những gì không. Ví dụ:

$AVAILABLE_PAGES = array('home', 'news', ...); 
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1); 

$page = $_GET['page']; 
if (!$AVAILABLE_PAGES[$page]) { 
    header("HTTP/1.0 404 Not Found"); 
    die('Page not found.'); 
} 

include "pages/$page.php"; 
7

Không "khử trùng" - Tấn công cụ thể cho việc sử dụng dữ liệu chứ không phải nguồn. Thoát giá trị khi bạn xuất chúng thay thế. Xem thêm câu trả lời của tôi cho What’s the best method for sanitizing user input with PHP?

+0

Tôi đọc nó, nhưng tôi không nghĩ rằng phù hợp với trang web tôi đang làm việc trên. –

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