Попытка получить код ошибки 403 через сокет - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть назначение программирования сокета python. Одной из задач является предотвращение злонамеренной атаки путем предотвращения любого URL-адреса, содержащего /../

. В своем коде ниже я закомментировал строку кода, которая, как я ожидал, выдаст ошибку 403 Forbidden. Но когда эта строка кода активна, на самом деле ничего не происходит. Я выполняю код из командной строки, используя curl (--path-as-is), чтобы убедиться, что /../ не удален (например, как Chrome делает). Но когда эта строка кода активна, в командной строке ничего не возвращается. Если строка кода закомментирована, то curl возвращает код ошибки 52. Но в конечном итоге я хотел бы получить код ошибки 403.

while True:
    print('Ready to serve....')
    connectionSocket, addr = serverSocket.accept() #Fill in code to get a connection
    try:
        message = connectionSocket.recv(1024).decode() #Fill in code to read GET request
        filename = message.split()[1]
        if("/../" in filename): #security code to see if there is a /../ in the filename URL
            #connectionSocket.send('HTTP/1.0 403 Forbidden\r\n'.encode()) # Send HTTP header line(s) into socket
            connectionSocket.close()
            continue;

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020
#connectionSocket.send('HTTP/1.0 403 Forbidden\r\n'.encode()) # Send HTTP header line(s) into socket

Это не будет действительный ответ HTTP. Вам не хватает окончательного \r\n в конце заголовка HTTP:

connectionSocket.send(b"HTTP/1.0 403 Forbidden\r\n\r\n")
0 голосов
/ 28 февраля 2020

Я предполагаю, что когда у вас активна эта строка, она отправит ошибку 403 и закроет сокетное соединение. Тем не менее, вы не выходите из l oop, и поэтому вы продолжите работать, пока l oop без вывода. Попробуйте изменить continue на break

while True:
    print('Ready to serve....')
    connectionSocket, addr = serverSocket.accept() #Fill in code to get a connection
    try:
        message = connectionSocket.recv(1024).decode() #Fill in code to read GET request
        filename = message.split()[1]
        if("/../" in filename): #security code to see if there is a /../ in the filename URL
            connectionSocket.send('HTTP/1.0 403 Forbidden\r\n'.encode()) # Send HTTP header line(s) into socket
            connectionSocket.close()
            break;#exits the while loop

Ошибка 52, возвращаемая CURL

Curl выдает эту ошибку, когда от сервера нет ответа, поскольку он ошибка HTTP, чтобы не ответить ни на что на запрос. Это имеет смысл, поскольку вы ничего не отправляете / не получаете через сокет, поскольку строка закомментирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...