Cách kiểm tra xem chuỗi có phải là URL hợp lệ không


7

WordPress cung cấp một chức năng hữu ích được gọi là is_email()kiểm tra xem một địa chỉ email cụ thể có hợp lệ không. Có một chức năng tương tự có sẵn để kiểm tra xem một URL có hợp lệ không?

Tôi đã cố gắng is_url()nhưng đó chỉ là suy nghĩ mong muốn từ phía tôi.

Tham chiếu: http://codex.wordpress.org/Function_Reference/is_email

Câu trả lời:


9

Sử dụng Trình xác thực bộ lọc hàm php

if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) {
    die('Not a valid URL');
}

Rất vui và cảm ơn @shanebp - không bao giờ biết rằng bộ lọc đã tồn tại!
henrywright

2
FILTER_VALIDATE_URL có vẻ tốt nhưng có một số vấn đề nghiêm trọng: d-mueller.de/blog/ Kẻ
tobltobs

@tobltobs: Đó không phải là vấn đề, chúng là các tính năng. Tác giả đang phàn nàn rằng các URL hợp lệ đang được báo cáo là hợp lệ. Điều đó giống như phàn nàn rằng PDO bị hỏng vì được cho phép $pdo->query("SELECT pw FROM users WHERE id={$_GET['id']}").
dotancohen

Bạn có thể đúng @dotancohen, đó là những URL hợp lệ về mặt kỹ thuật. Vì vậy, có lẽ vấn đề thực sự là trong câu hỏi của chúng tôi. Chúng tôi không chỉ muốn "URL hợp lệ về mặt kỹ thuật", chúng tôi muốn "URL an toàn". ví dụ: các URL giúp ngăn chặn các cuộc tấn công XSS hoặc các hành vi đồi bại khác. Đề xuất của @ orionrush tránh được một số vấn đề đó, trong khi FILTER_VALIDATE_URLkhông.
thespacecamel

Cách của bạn xác nhận ttps://www.youtube.comlà hợp lệ. Nói cách khác - không sử dụng FILTER_VALIDATE_URL - nó không đáng tin cậy.
Jeffz

6

Tôi biết đây là một bài viết cũ, nhưng đối với bất kỳ ai truy cập cũng nên xem xét các chức năng WP esc_url()esc_url_raw(), sau này an toàn cho các mục cơ sở dữ liệu, v.v., vì nó không mã hóa các thực thể. esc_url()không mã hóa các thực thể và vì vậy rất tốt để hiển thị cho người dùng.

Trong nguồn bạn có thể thấy rằng esc_url()kiểm tra danh sách trắng các giao thức và cấu trúc được phép và do đó tránh được một số lỗ hổng được FILTER_VALIDATE_URLlưu ý bởi liên kết được đặt ra bởi @tobltobs.


2

Tôi thấy wp_http_validate_urlkhá thuận tiện để kiểm tra xem một chuỗi trong URL hợp lệ hay không trong khi làm việc với dự án của tôi.

Tham khảo từ đây: https://developer.wordpress.org/reference/fifts/wp_http_validate_url/

Ví dụ:

$val = 'http://somevalidurl.com';
if ( wp_http_validate_url( $val ) ) {

    // It's valid URL;

} else {

    // It's NOT valid URL;

}

Nó trả về chính URL nếu nó hợp lệ, khác sai.


Hàm này nghe có vẻ hay, nhưng tôi nghĩ nó đã mắc một vài lỗi liên quan đến dữ liệu do người dùng gửi. Nó tìm thấy URL localhostkhông hợp lệ; nhưng nó http://example.com/"><script>alert("xss")</script>được coi là hợp lệ
thespacecamel

xin lỗi, SO không cho phép tôi sửa đổi nhận xét của tôi. Tôi có nghĩa là nó tìm thấy http://localhostkhông hợp lệ.
thespacecamel

1
@thespacecamel Bạn có thể sử dụng http_request_host_is_externalbộ lọc để cho phép localhost: function allow_some_url( $external, $host, $url ) { return ( $host === 'localhost' ) ? true : $external; } add_filter( 'http_request_host_is_external', 'allow_some_url', 10, 3 ); if ( wp_http_validate_url( 'http://localhost/wordpress/' ) ) { echo 'valid'; } else { echo 'invalid'; }
Ashish Shrestha

Hãy nhớ rằng nó có thể hơi chậm, vì nó sử dụng gethostbyname()để lấy IP của URL để xác nhận thêm.
Lucas Bustamante

0

Để đảm bảo URL do người dùng gửi là hợp lệ và an toàn để lưu trữ và hiển thị sau này, tôi đề xuất

esc_url_raw($url) === $url

esc_url_raw(), như @orionrush đã đề cập ở trên, vệ sinh URL bằng cách xóa bất kỳ thứ gì không hợp lệ hoặc độc hại khỏi nó. Vì vậy, nếu chuỗi không có gì không hợp lệ hoặc độc hại thì cũng không sao.

Ví dụ

if( esc_url_raw($url) === $url ) {
   // URL is valid. Use it...
} else {
   // URL is invalid or malicious. Don't use it...
}

Tôi đã viết một bài đăng blog dài hơn trên đó tại đây: https://cmljnelson.wordpress.com/2018/08/31/url-validation-in-wordpress/


0

Theo tôi thì tốt hơn là sử dụng wp_http_validate_url .

Ví dụ 1:

filter_var( '//website.com', FILTER_VALIDATE_URL )

Trả lại sai.

Ví dụ 2:

wp_http_validate_url( '//website.com' )

Trả lại url.

  1. Khi bạn không biết là trang web sử dụng giao thức https hoặc http, tốt hơn là sử dụng '//'.
  2. wp_http_validate_url được cải thiện bởi các nhà phát triển WP (cụ thể hơn).
  3. Về mặt lý thuyết bạn có thể sử dụng một số hook (bộ lọc & hành động) cho wp_http_validate_url . Bạn không thể sử dụng hook cho filter_var .

Tham chiếu: https://developer.wordpress.org/reference/fifts/wp_http_validate_url/

Tham chiếu: https://www.php.net/manual/en/feft.filter-var.php


-2

is_email(), thực sự không kiểm tra xem một địa chỉ email có hợp lệ không, chỉ khi nó phù hợp với thông số kỹ thuật. Email tôi sẵn sàng cung cấp cho nhiều trang web thể hiện sự quan tâm vô nghĩa đối với địa chỉ email của tôi là a@b.com là địa chỉ phù hợp nhưng không chắc có ai sử dụng nó.

Kiểm tra các url được thực hiện tốt nhất bằng cách ping chúng. Bạn có thể thử kiểm tra sự phù hợp, nhưng trên lý thuyết có rất ít hạn chế đối với những gì một url được mã hóa có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.