2013-06-03 48 views
6

Tôi cố gắng để tránh XSS tấn công qua url
url: http://example.com/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29 Tôi đã thửngăn chặn cuộc tấn công XSS qua url (PHP)

var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL)); 

và khác url_validation sử dụng regex nhưng không có tác dụng gì cả. ở trên liên kết cho thấy tất cả các thông tin nhưng css của tôi và một số chức năng java script không hoạt động. vui lòng đề xuất giải pháp tốt nhất có thể ...

+0

Nếu liên kết này URL của bạn hoặc liên kết từ cơ sở dữ liệu ... vì nếu nó từ URL .. y Bạn nên lọc '$ _GET' – Baba

+0

Tôi không nhận được hoặc xử lý bất kỳ thông số nào trên trang này .. –

+0

Bạn có ý gì khi không nhận được bất kỳ thông số nào trên trang này? – Baba

Trả lời

0

Nếu bạn đang sử dụng MVC, hãy thử giải mã tất cả giá trị trước khi định tuyến và sử dụng stript_tags() để loại bỏ các lỗi này. Và như các tài liệu nói, trường hợp không nên tác động gì cả.

Nếu không, hãy tạo một hàm tiện ích và thực hiện tương tự trong khi truy xuất các biến từ URI. Nhưng tôi không phải là một chuyên gia XSS, vì vậy đây có thể chỉ là một phần của thủ thuật.

Từ Janis Peisenieks

+1

không có tôi đang không sử dụng MVc ... –

0

Bước 1: Escape Output Được cung cấp bởi người dùng

Nếu bạn muốn bao gồm dữ liệu trong một trang đó là được cung cấp bởi người dùng, thoát sản lượng. Và, trong danh sách được đơn giản hóa này, chúng ta sẽ kết hợp với một thao tác thoát đơn giản: HTML mã hóa bất kỳ <,>, &, ‘,“. Ví dụ, PHP cung cấp hàm htmlspecialchars() để thực hiện nhiệm vụ chung này.

Bước 2: Luôn luôn sử dụng XHTML

Đọc qua các chiến lược phòng ngừa XSS OWASP, và nó trở nên rõ ràng rằng việc bảo vệ chống tiêm đòi hỏi nỗ lực nhiều hơn nữa nếu bạn sử dụng thuộc tính không thể viện chứng trong HTML của bạn. Ngược lại, trong các thuộc tính được trích dẫn, dữ liệu thoát sẽ trở thành quá trình tương tự cần thiết để thoát dữ liệu cho nội dung trong các thẻ, hoạt động thoát mà chúng tôi đã nêu ở trên. Đó là bởi vì người gây rối duy nhất trong việc lẻn vào nội dung có cấu trúc quan trọng trong bối cảnh thuộc tính được trích dẫn là báo giá đóng.

Rõ ràng, đánh dấu của bạn không phải là XHTML để chứa các thuộc tính được trích dẫn. Tuy nhiên, việc chụp và xác thực XHTML sẽ giúp bạn dễ dàng kiểm tra xem tất cả các thuộc tính có được trích dẫn hay không.

Bước 3: Chỉ cho phép giá trị chữ và số liệu trong CSS và JavaScript

Chúng ta cần phải giới hạn dữ liệu bạn cho phép từ người dùng đó sẽ được xuất ra trong phần CSS và Javascript của trang để tự chữ và số (ví dụ, một regex như [a-zA-Z0-9] +) loại và đảm bảo chúng được sử dụng trong ngữ cảnh mà chúng thực sự đại diện cho các giá trị. Trong Javascript, điều này có nghĩa là dữ liệu người dùng chỉ nên được xuất trong các chuỗi được gán cho các biến (ví dụ, var userId = “ALPHANUMERIC_USER_ID_HERE” ;.) Trong CSS điều này có nghĩa là dữ liệu người dùng chỉ được xuất trong ngữ cảnh cho một giá trị thuộc tính (ví dụ: p {color: #ALPHANUMERIC_USER_COLOR_HERE;}.) Điều này có vẻ là Draconian, nhưng, này, đây được cho là một hướng dẫn XSS đơn giản

Bây giờ, để rõ ràng, bạn nên luôn xác thực dữ liệu người dùng để đảm bảo dữ liệu đáp ứng mong đợi của bạn , ngay cả đối với dữ liệu đầu ra trong các thẻ hoặc thuộc tính, như trong các ví dụ trước đó. Tuy nhiên, điều này đặc biệt quan trọng đối với các vùng CSS và JavaScript, vì tính phức tạp của các cấu trúc dữ liệu có thể khiến cho việc tấn công XSS trở nên cực kỳ khó khăn.

Dữ liệu phổ biến bạn có thể muốn người dùng có thể cung cấp cho JavaScript của bạn như Facebook, Youtube và ID của Twitter đều có thể được sử dụng trong khi có hạn chế này.Và, các thuộc tính màu CSS và các kiểu khác cũng có thể được tích hợp.

Bước 4: URL-Mã hóa URL Query String thông số

Nếu dữ liệu người dùng là đầu ra trong vòng một tham số URL của một chuỗi truy vấn liên kết, hãy chắc chắn để URL mã hóa dữ liệu. Một lần nữa, sử dụng PHP làm ví dụ, bạn có thể chỉ cần sử dụng hàm urlencode(). Bây giờ, hãy làm rõ điều này và làm việc thông qua một vài ví dụ, vì tôi đã thấy nhiều sự nhầm lẫn liên quan đến điểm cụ thể này.

Phải URL mã hóa

Ví dụ sau kết quả đầu ra dữ liệu người dùng mà phải được mã hóa URL vì nó được sử dụng như một giá trị trong chuỗi truy vấn.

http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED”>

Phải Không URL-Encode

Ví dụ sau xuất ra dữ liệu người dùng cung cấp cho toàn bộ URL. Trong trường hợp này, dữ liệu người dùng phải được thoát bằng hàm thoát chuẩn (HTML mã hóa bất kỳ <,>, &, ‘,"), không được mã hóa URL. Mã hóa URL ví dụ này sẽ dẫn đến các liên kết không đúng định dạng.

+0

Tôi cũng đã sử dụng url_encode nhưng nó không thể ngăn chặn từ những gì tôi hỏi trong câu hỏi của tôi. –

+0

Bước 2: Luôn sử dụng XHTML. Dude gì về HTML5? – Robert

+0

@Robert trang web được thực hiện trong lõi php và và một thời gian rất dài trước đây, xin vui lòng cho tôi biết tôi có thể xác nhận các loại url là url xấu ... –

4

Hãy thử sử dụng FILTER_SANITIZE_SPECIAL_CHARS Thay vào đó

$url = 'http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29'; 

// Original 
echo $url, PHP_EOL; 

// Sanitise 
echo sanitiseURL($url), PHP_EOL; 

// Satitise + URL encode 
echo sanitiseURL($url, true), PHP_EOL; 

Output

http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29 
http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/&#34;ns=&#34;alert(0x0000DC) 
http%3A%2F%2F10.0.4.2%2FonlineArcNew%2Fhtml%2Fterms_conditions_1.php%2F%26%2334%3Bns%3D%26%2334%3Balert%280x0000DC%29 

Chức năng sử dụng

function sanitiseURL($url, $encode = false) { 
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS); 
    if (! filter_var($url, FILTER_VALIDATE_URL)) 
     return false; 
    return $encode ? urlencode($url) : $url; 
} 
+1

tôi cũng đã cố gắng này cũng nhưng tôi không có để lưu trữ nó, tôi phải thực hiện liên kết này, ở cuối dòng nó chứa hàm javascript, hàm này cho biết url hợp lệ nên không giải quyết được mục đích của tôi .. –

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