GOLANG_INTERVIEW Telegram 492
👣 В чём суть реализации уязвимости c помощью перестановки defer response.Body.Close()

▶️Итак, есть такой обработчик, и реализация уязвимости связана с тем, что тело ответа закрывается до проверки ошибки.
func HandleRequest(client http.Client, request *http.Request)
(*http.Response, error) {
response, err := client.Do(request)
defer response.Body.Close()
if err != nil {
return nil, err
}
}

А теперь вопрос: почему это должно работать, ведь тело всё равно закрыто, не зависимо до проверки или после?

Известно, что полное отсутствие строки defer response.Body.Close() приводит к гарантированным проблемам, но как протестировать вышеупомянутую уязвимость?


▶️Суть в следующем: defer response.Body.Close() означает, что response.Body.Close() должно быть выполнено в точке выхода из функции. Ни о каком закрытии тела до проверки ошибки речь не идёт.

Проблема здесь в другом — в случае ошибки response может быть nil, и выполнение отложенной инструкции в ветке if err != nil {... return ...} в таком случае приведет к панике из-за обращения к нулевому указателю.
panic: runtime error: invalid memory address or nil pointer dereference


А вот собственно и код:
package main

import (
"fmt"
"io"
"net/http"
"net/url"
"os"
)

func main() {
client := http.Client{}
url, _ := url.Parse("https://no.such.host")
request := &http.Request{
Method: "GET",
URL: url,
}

response, err := client.Do(request)
defer response.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "Request failed: %s\n", err.Error())
}

io.Copy(os.Stdout, response.Body)

}


Как-то так

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3👏2💯21



tgoop.com/golang_interview/492
Create:
Last Update:

👣 В чём суть реализации уязвимости c помощью перестановки defer response.Body.Close()

▶️Итак, есть такой обработчик, и реализация уязвимости связана с тем, что тело ответа закрывается до проверки ошибки.

func HandleRequest(client http.Client, request *http.Request)
(*http.Response, error) {
response, err := client.Do(request)
defer response.Body.Close()
if err != nil {
return nil, err
}
}

А теперь вопрос: почему это должно работать, ведь тело всё равно закрыто, не зависимо до проверки или после?

Известно, что полное отсутствие строки defer response.Body.Close() приводит к гарантированным проблемам, но как протестировать вышеупомянутую уязвимость?


▶️Суть в следующем: defer response.Body.Close() означает, что response.Body.Close() должно быть выполнено в точке выхода из функции. Ни о каком закрытии тела до проверки ошибки речь не идёт.

Проблема здесь в другом — в случае ошибки response может быть nil, и выполнение отложенной инструкции в ветке if err != nil {... return ...} в таком случае приведет к панике из-за обращения к нулевому указателю.
panic: runtime error: invalid memory address or nil pointer dereference


А вот собственно и код:
package main

import (
"fmt"
"io"
"net/http"
"net/url"
"os"
)

func main() {
client := http.Client{}
url, _ := url.Parse("https://no.such.host")
request := &http.Request{
Method: "GET",
URL: url,
}

response, err := client.Do(request)
defer response.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "Request failed: %s\n", err.Error())
}

io.Copy(os.Stdout, response.Body)

}


Как-то так

@golang_interview

BY Golang вопросы собеседований




Share with your friend now:
tgoop.com/golang_interview/492

View MORE
Open in Telegram


Telegram News

Date: |

fire bomb molotov November 18 Dylan Hollingsworth yau ma tei Informative Image: Telegram. The best encrypted messaging apps Telegram channels enable users to broadcast messages to multiple users simultaneously. Like on social media, users need to subscribe to your channel to get access to your content published by one or more administrators.
from us


Telegram Golang вопросы собеседований
FROM American