Обход веб-приложения (ASP.net ) с логином

#asp.net-mvc #python-3.x #python-requests #web-crawler

#asp.net-mvc #python-3.x #python-запросы #веб-сканер

Вопрос:

Я хочу обход веб-приложения (ASP.NET ) для которого требуется логин.

URL, с которого я хочу сканировать данные:https://wo.gruposese.com/mod_Clientes/Pedido

URL для входа в систему:https://wo.gruposese.com/Login.aspx?ReturnUrl=/Default.aspx

Я попробовал следующий код (я использую прокси, но в этом коде я опускаю часть прокси, потому что он работает нормально, что означает, что я могу получить простой HTML-код с веб-сайта, но просто не могу войти в систему — так что это не должно быть проблемой):

 import requests
from lxml import html

username = "I-am-a-username"
password = "I-am-a-password"
url = "https://wo.gruposese.com/Login.aspx?ReturnUrl=/Default.aspx"

session_requests = requests.session()
result = session_requests.get(url)

tree = html.fromstring(result.text)
auth_key = list(set(tree.xpath("//input[@name='__VIEWSTATE']/@value")))[0]

payload = {
    "LoginControl$UserName": username,
    "LoginControl$Password": password,
    "__VIEWSTATE": auth_key
}

session_requests.get(url, data=payload, headers=dict(referer=url))
  

Однако я получаю, казалось бы, бесконечное сообщение об ошибке:

 ---------------------------------------------------------------------------
gaierror                                  Traceback (most recent call last)
C:Anaconda3libsite-packagesurllib3connection.py in _new_conn(self)
    158             conn = connection.create_connection(
--> 159                 (self._dns_host, self.port), self.timeout, **extra_kw)
    160 

C:Anaconda3libsite-packagesurllib3utilconnection.py in create_connection(address, timeout, source_address, socket_options)
     56 
---> 57     for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
     58         af, socktype, proto, canonname, sa = res

C:Anaconda3libsocket.py in getaddrinfo(host, port, family, type, proto, flags)
    747     addrlist = []
--> 748     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    749         af, socktype, proto, canonname, sa = res

gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

NewConnectionError                        Traceback (most recent call last)
C:Anaconda3libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    599                                                   body=body, headers=headers,
--> 600                                                   chunked=chunked)
    601 

C:Anaconda3libsite-packagesurllib3connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    342         try:
--> 343             self._validate_conn(conn)
    344         except (SocketTimeout, BaseSSLError) as e:

C:Anaconda3libsite-packagesurllib3connectionpool.py in _validate_conn(self, conn)
    838         if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
--> 839             conn.connect()
    840 

C:Anaconda3libsite-packagesurllib3connection.py in connect(self)
    300         # Add certificate verification
--> 301         conn = self._new_conn()
    302         hostname = self.host

C:Anaconda3libsite-packagesurllib3connection.py in _new_conn(self)
    167             raise NewConnectionError(
--> 168                 self, "Failed to establish a new connection: %s" % e)
    169 

NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

MaxRetryError                             Traceback (most recent call last)
C:Anaconda3libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    448                     retries=self.max_retries,
--> 449                     timeout=timeout
    450                 )

C:Anaconda3libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    637             retries = retries.increment(method, url, error=e, _pool=self,
--> 638                                         _stacktrace=sys.exc_info()[2])
    639             retries.sleep()

C:Anaconda3libsite-packagesurllib3utilretry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    397         if new_retry.is_exhausted():
--> 398             raise MaxRetryError(_pool, url, error or ResponseError(cause))
    399 

MaxRetryError: HTTPSConnectionPool(host='wo.gruposese.com', port=443): Max retries exceeded with url: /Login.aspx?ReturnUrl=/Default.aspx (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

ConnectionError                           Traceback (most recent call last)
<ipython-input-1-f6691b6c307b> in <module>
     23 
     24 
---> 25 session_requests.get(url, data=payload, headers=dict(referer=url))

C:Anaconda3libsite-packagesrequestssessions.py in get(self, url, **kwargs)
    544 
    545         kwargs.setdefault('allow_redirects', True)
--> 546         return self.request('GET', url, **kwargs)
    547 
    548     def options(self, url, **kwargs):

C:Anaconda3libsite-packagesrequestssessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    531         }
    532         send_kwargs.update(settings)
--> 533         resp = self.send(prep, **send_kwargs)
    534 
    535         return resp

C:Anaconda3libsite-packagesrequestssessions.py in send(self, request, **kwargs)
    644 
    645         # Send the request
--> 646         r = adapter.send(request, **kwargs)
    647 
    648         # Total elapsed time of the request (approximately)

C:Anaconda3libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    514                 raise SSLError(e, request=request)
    515 
--> 516             raise ConnectionError(e, request=request)
    517 
    518         except ClosedPoolError as e:

ConnectionError: HTTPSConnectionPool(host='wo.gruposese.com', port=443): Max retries exceeded with url: /Login.aspx?ReturnUrl=/Default.aspx (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
  

У меня есть два вопроса:

  1. Я, по-видимому, что-то здесь не так, но я уже так много пробовал, и у меня ничего не работает. Обычно я предполагаю наличие токена csrf для использования в словаре полезной нагрузки, но на этом веб-сайте, похоже, его нет… Я не уверен, что проблема здесь в «__VIEWSTATE».

  2. Кроме того, мне интересно, как я могу продолжить после входа на фактическую веб-страницу (см. URL выше) в этом ASP.net регистрировать и сканировать данные оттуда?

P.S. Мне не разрешено устанавливать Selenium и, следовательно, необходимо решить проблему с запросами или scrapy.

Комментарии:

1. Для # 1, ASP.Net Viewstate может быть сложным. Иногда это зависит от javascript, и если вы не реплицируете это точно, страницы не будут отображать правильные данные. Например, вместо запроса get на URL для следующей страницы вам может потребоваться опубликовать общий щелчок кнопки «далее» на той же странице, чтобы увеличить значение ViewState или Session, которое вы не можете прочитать чисто. По этой причине ASP.net страницы webforms имеют репутацию немного более сложных для обхода. Часто владельцы сайтов рассматривают это как функцию.

2. Для части # 2 сервер, скорее всего, установит cookie, который вы должны включить вместе с последующими запросами. Этот файл cookie будет содержать токен аутентификации, который будет проверен на соответствие вашей подписи запроса (тот же исходный IP / пользовательский агент / токен csrf).