Broken link를 찾자! DeadFinder

최근에 Broken Link(Dead Link)를 쉽게 찾기 위한 도구를 하나 만들었습니다. 제 블로그의 Broken Link를 찾기 위한 목적이였지만, 가볍게라도 한번 공유하는게 좋을 것 같아서 블로그 글로 작성해봅니다.

DeadFinder 입니다 :D

Broken Link는 Dead Link 로도 불리며 웹 페이지 내 연결이 불가능한 링크들을 의미합니다. 기본적으로는 a 태그의 href 부터 script src 등 여러 elements에서 호출되는 웹 링크들입니다.

<!-- Example -->
<a href="https://www.hahwul.com/useful-link/index">Useful Link</a>

<!-- 
    $ http https://www.hahwul.com/useful-link/index --headers
    HTTP/1.1 404 Not Found
    Accept-Ranges: bytes
    Access-Control-Allow-Origin: *
-->

이러한 Broken Link 는 SEO(Search Engine Optimization)에 악영향을 미치고, 연결된 도메인 등에 따라서 보안적인 문제를 일으킬 수도 있습니다.

사용자들은 링크를 클릭할 때 주소 뿐만 아니라 해당 페이지의 신뢰성도 고려하게 됩니다. 만약 Broken Link를 누군가 Takover한 경우 서비스의 신뢰도를 이용한 공격에 사용될 수 있습니다.

Deadfinder

deadfinder는 웹 페이지 내 링크 등을 식별하고 테스트하여 Broken Link를 찾아주는 도구입니다.

Installation

# Install with Gem
gem install deadfinder

# Run on Docker
docker pull ghcr.io/hahwul/deadfinder:latest

Usage

Modes

현재까지 크게 4가지의 모드를 지웝합니다. 각 모드의 역할은 아래와 같습니다.

  Description Example
url 단일 URL을 스캔합니다. deadfinder url https://www.hahwul.com
sitemap Sitemap을 분석하여 다수의 URL들을 스캔합니다. deadfinder sitemap https://www.hahwul.com/sitemap.xml
file List 형태의 파일을 읽어 다수의 URL들을 스캔합니다. deadfinder file urls.txt
pipe STDIN으로 부터 입력받아 다수의 URL들을 스캔합니다. cat urls.txt | deadfinder pipe

Options

스캔 속도에 영향을 주는 -c, -t 그리고 JSON Result로 처리하기 위한 -o 옵션을 지원합니다.

Options:
  c, [--concurrency=N]  # Set Concurrncy
                        # Default: 20
  t, [--timeout=N]      # Set HTTP Timeout
                        # Default: 10
  o, [--output=OUTPUT]  # Save JSON Result

Targets

현재는 앵커태그(a)와 script, link 태그 등을 기반으로 체크합니다. form이나 img는 추후에 추가할 예정이고, 많은 결과가 발생할 수도 있어서 옵셔널하게 줄 예정입니다.

Upcoming features

  • Support Github Action
  • Support Jekyll and Hugo
  • Support Local Filesystem
  • Add More Targets