펄처럼 보였던 언어 코드
이 글의 내용
2026년 8월 19일, 브라우저에 직접 내보내서는 안 되는 부류의 파일을 막는 규칙을 .htaccess에 더했습니다. 편집한 뒤 웹 디렉터리에 남은 소스 코드 사본 — index.php.bak, 떠도는 config.py, 방문자가 실행 대신 소스를 평문으로 가져갈 수 있는 스크립트 확장자를 가진 모든 것입니다.
규칙은 파일 확장자로 맞추었습니다. .php, .py, .rb, .pl, 그 밖에 열두 가지쯤입니다. .pl는 펄입니다. 이 프로젝트에는 펄이 한 줄도 없습니다 — 규칙은 예방책이었지 존재하는 파일에 대한 수리가 아니었습니다.
하루쯤 뒤, 한 방문자가 카운터 미리보기가 망가졌다고 알려 왔습니다. 전부였고, 다만 한 언어에서만이었습니다.
또 다른 "pl"
stats4u.net은 고정된 기본값이 아니라 Accept-Language 협상으로 방문자마다 언어를 고릅니다 — 폴란드어로 설정된 브라우저는 /pl/를 곧바로 받고 이동은 없으며, 맞는 것이 없을 때 영어로 돌아갑니다. 폴란드어는 자주 맞습니다. 미리보기가 하루 망가지면 오래 눈에 띄지 않을 수 없을 만큼 방문자가 옵니다.
디자인 미리보기는 저마다 스타일과 언어별로 작은 파일 하나입니다: cache/preview/2900.pl.svg. 잡으려던 패턴은 something.pl — 펄 스크립트 — 였는데, 2900.pl 뒤에 .svg가 오는 경우에도 맞았습니다. 스타일 번호, 마침 스크립트 확장자와 같은 철자를 가진 언어 코드, 그다음 진짜 파일 종류입니다. 점-pl-점 패턴은 그 둘을 구별하지 못합니다.
갤러리의 모든 .pl.svg 미리보기와 .pl.png 미리보기가 403 Forbidden으로 답하기 시작했습니다. 다른 모든 언어는 멀쩡했습니다. 이 사이트가 쓰는 다른 어떤 언어 코드도 확장자 목록의 항목과 부딪히지 않기 때문입니다. 딱 그 하나였습니다.
무엇이 바뀌었는가
pl가 확장자 목록에서 빠졌습니다. 이 프로젝트가 걱정할 이유가 있는 모든 진짜 스크립트 확장자는 여전히 막고, 언어는 더는 막지 않습니다.
애초에 왜 일어났는지 때문에 적어 둘 값어치가 있습니다. 파일 확장자 목록과 언어 코드 목록은 서로 다른 어휘에서 오고, 두 글자짜리 항목이 둘 다를 동시에 뜻하는 것을 막는 것은 없습니다. 경로에 언어 접두사가 있는 사이트에서 둘 가운데 어느 목록에 무언가를 더하기 전에 다른 목록과 맞춰 보십시오. 여기서는 그 확인이 없었고, 미리보기가 망가진 것을 알아챈 독자가 그것을 드러냈습니다 — 그래서 이제 pl가 목록에 없다는 사실에는 그 까닭을 적은 주석이 붙어 있고, 다음 정리는 규칙보다 그 까닭을 먼저 만나게 됩니다.