diff --git a/internal/scan/frameworks/detect_test.go b/internal/scan/frameworks/detect_test.go index d12d4e1..62b1414 100644 --- a/internal/scan/frameworks/detect_test.go +++ b/internal/scan/frameworks/detect_test.go @@ -1090,3 +1090,49 @@ func TestDetectFramework_SpringBootFalsePositive(t *testing.T) { t.Errorf("expected no Spring Boot match for prose mentioning it, got %.2f confidence", result.Confidence) } } + +func TestDetectFramework_CodeIgniter(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Set-Cookie", "ci_session=a1b2c3d4e5; path=/; HttpOnly") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`

My Shop

`)) + })) + defer server.Close() + + result, err := frameworks.DetectFramework(server.URL, 5*time.Second, "") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if result == nil { + t.Fatal("expected result, got nil") + } + if result.Name != "CodeIgniter" { + t.Errorf("expected framework 'CodeIgniter', got '%s'", result.Name) + } +} + +func TestDetectFramework_CodeIgniterFalsePositive(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte(` + + + +

Best PHP frameworks in 2026

+

Laravel and codeigniter both ship a router and an ORM.

+ codeigniter.com +
composer create-project codeigniter4/appstarter
+ + + `)) + })) + defer server.Close() + + result, err := frameworks.DetectFramework(server.URL, 5*time.Second, "") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if result != nil && result.Name == "CodeIgniter" { + t.Errorf("expected no CodeIgniter match for prose mentioning it, got %.2f confidence", result.Confidence) + } +} diff --git a/internal/scan/frameworks/detectors/backend.go b/internal/scan/frameworks/detectors/backend.go index b5831d3..7e9b45e 100644 --- a/internal/scan/frameworks/detectors/backend.go +++ b/internal/scan/frameworks/detectors/backend.go @@ -468,7 +468,6 @@ func (d *codeigniterDetector) Name() string { return "CodeIgniter" } func (d *codeigniterDetector) Signatures() []fw.Signature { return []fw.Signature{ - {Pattern: "codeigniter", Weight: 0.4}, {Pattern: "ci_session", Weight: 0.4, HeaderOnly: true}, } }