mirror of
https://github.com/projectdiscovery/httpx.git
synced 2024-11-28 13:04:02 +03:00
Implemented a redirect strategy which respects HSTS headers and modifies the URL accordingly if necessary
This commit is contained in:
parent
0b702c5713
commit
964cc3bbd0
@ -75,6 +75,27 @@ func New(options *Options) (*HTTPX, error) {
|
|||||||
redirectFunc = func(redirectedRequest *http.Request, previousRequests []*http.Request) error {
|
redirectFunc = func(redirectedRequest *http.Request, previousRequests []*http.Request) error {
|
||||||
// add custom cookies if necessary
|
// add custom cookies if necessary
|
||||||
httpx.setCustomCookies(redirectedRequest)
|
httpx.setCustomCookies(redirectedRequest)
|
||||||
|
|
||||||
|
//Add redirect policy which takes HSTS into account.
|
||||||
|
//Since the net/http/client doesn't take it into account
|
||||||
|
//it is possible to modify it here.
|
||||||
|
//If during redirect the scheme switches from HTTPS to HTTP
|
||||||
|
//but the Strict-Transport-Security header is present the request
|
||||||
|
//would go to the specified location. This could mean that it is not
|
||||||
|
//followed the same way as a browser. There exist some cases in the wild.
|
||||||
|
if httpx.Options.RespectHSTS {
|
||||||
|
location := redirectedRequest.Response.Header.Get("Location")
|
||||||
|
hsts := redirectedRequest.Response.Header.Get("Strict-Transport-Security")
|
||||||
|
url, err := redirectedRequest.URL.Parse(location)
|
||||||
|
if err != nil {
|
||||||
|
} else {
|
||||||
|
if url.Scheme == "http" && hsts != "" {
|
||||||
|
url.Scheme = "https"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
redirectedRequest.URL = url
|
||||||
|
}
|
||||||
|
|
||||||
if len(previousRequests) >= options.MaxRedirects {
|
if len(previousRequests) >= options.MaxRedirects {
|
||||||
// https://github.com/golang/go/issues/10069
|
// https://github.com/golang/go/issues/10069
|
||||||
return http.ErrUseLastResponse
|
return http.ErrUseLastResponse
|
||||||
|
@ -24,6 +24,7 @@ type Options struct {
|
|||||||
VHostSimilarityRatio int
|
VHostSimilarityRatio int
|
||||||
FollowRedirects bool
|
FollowRedirects bool
|
||||||
FollowHostRedirects bool
|
FollowHostRedirects bool
|
||||||
|
RespectHSTS bool
|
||||||
MaxRedirects int
|
MaxRedirects int
|
||||||
Unsafe bool
|
Unsafe bool
|
||||||
TLSGrab bool
|
TLSGrab bool
|
||||||
|
@ -186,6 +186,7 @@ type Options struct {
|
|||||||
Location bool
|
Location bool
|
||||||
ContentLength bool
|
ContentLength bool
|
||||||
FollowRedirects bool
|
FollowRedirects bool
|
||||||
|
RespectHSTS bool
|
||||||
StoreResponse bool
|
StoreResponse bool
|
||||||
JSONOutput bool
|
JSONOutput bool
|
||||||
CSVOutput bool
|
CSVOutput bool
|
||||||
@ -409,6 +410,7 @@ func ParseOptions() *Options {
|
|||||||
flagSet.BoolVarP(&options.FollowRedirects, "follow-redirects", "fr", false, "follow http redirects"),
|
flagSet.BoolVarP(&options.FollowRedirects, "follow-redirects", "fr", false, "follow http redirects"),
|
||||||
flagSet.IntVarP(&options.MaxRedirects, "max-redirects", "maxr", 10, "max number of redirects to follow per host"),
|
flagSet.IntVarP(&options.MaxRedirects, "max-redirects", "maxr", 10, "max number of redirects to follow per host"),
|
||||||
flagSet.BoolVarP(&options.FollowHostRedirects, "follow-host-redirects", "fhr", false, "follow redirects on the same host"),
|
flagSet.BoolVarP(&options.FollowHostRedirects, "follow-host-redirects", "fhr", false, "follow redirects on the same host"),
|
||||||
|
flagSet.BoolVarP(&options.RespectHSTS, "respect-hsts", "rhsts", false, "respect HSTS response headers for redirect requests"),
|
||||||
flagSet.BoolVar(&options.VHostInput, "vhost-input", false, "get a list of vhosts as input"),
|
flagSet.BoolVar(&options.VHostInput, "vhost-input", false, "get a list of vhosts as input"),
|
||||||
flagSet.StringVar(&options.Methods, "x", "", "request methods to probe, use 'all' to probe all HTTP methods"),
|
flagSet.StringVar(&options.Methods, "x", "", "request methods to probe, use 'all' to probe all HTTP methods"),
|
||||||
flagSet.StringVar(&options.RequestBody, "body", "", "post body to include in http request"),
|
flagSet.StringVar(&options.RequestBody, "body", "", "post body to include in http request"),
|
||||||
|
@ -106,6 +106,7 @@ func New(options *Options) (*Runner, error) {
|
|||||||
httpxOptions.RetryMax = options.Retries
|
httpxOptions.RetryMax = options.Retries
|
||||||
httpxOptions.FollowRedirects = options.FollowRedirects
|
httpxOptions.FollowRedirects = options.FollowRedirects
|
||||||
httpxOptions.FollowHostRedirects = options.FollowHostRedirects
|
httpxOptions.FollowHostRedirects = options.FollowHostRedirects
|
||||||
|
httpxOptions.RespectHSTS = options.RespectHSTS
|
||||||
httpxOptions.MaxRedirects = options.MaxRedirects
|
httpxOptions.MaxRedirects = options.MaxRedirects
|
||||||
httpxOptions.HTTPProxy = options.HTTPProxy
|
httpxOptions.HTTPProxy = options.HTTPProxy
|
||||||
httpxOptions.Unsafe = options.Unsafe
|
httpxOptions.Unsafe = options.Unsafe
|
||||||
|
Loading…
Reference in New Issue
Block a user