Όταν το CONNECT επιστρέφει 200 και το TLS αποτυγχάνει αμέσως να αποκωδικοποιήσει, ελέγξτε τα bytes ορίων στον connector πριν αλλάξετε πιστοποιητικά ή κρυπτοσυστήματα.

Μια παραγόμενη τιμή εξουσιοδότησης μπορεί να τελειώνει ήδη με newline. Η προσθήκη άλλου τέλους γραμμής μπορεί να τερματίσει πρόωρα τις κεφαλίδες HTTP, αφήνοντας ένα προβλεπόμενο πεδίο Host ή άλλο απλό κείμενο πίσω από το αίτημα.

Ένα ελάχιστο αίτημα HTTP/1.1 CONNECT χρησιμοποιεί CRLF μεταξύ γραμμών και μια κενή γραμμή στο τέλος:

b"CONNECT example.com:443 HTTP/1.1\r\nHost: example.com:443\r\n\r\n"

Τοποθετήστε οποιοδήποτε πεδίο εξουσιοδότησης πριν από αυτή την τελευταία κενή γραμμή, χωρίς ενσωματωμένη αλλαγή γραμμής. Στην Python, το "\n" αντιπροσωπεύει newline· ένα raw string με backslash και το γράμμα n όχι. Ελέγξτε ποια bytes παράγει ένας βοηθός κωδικοποίησης πριν προσπαθήσετε να τα αφαιρέσετε—παλαιότεροι βοηθοί μπορούσαν να προσθέσουν αλλαγές γραμμής.

Μόλις το CONNECT πετύχει, αυτά τα υπόλοιπα bytes ανήκουν στο πρωτόκολλο της σήραγγας. Απλό κείμενο που έχει ξεφύγει μπορεί να φτάσει σε έναν peer που περιμένει TLS. Η επιτυχής κατάσταση δεν μπορεί να διορθώσει bytes που έχουν ήδη μπει στην ουρά μετά από παραμορφωμένο αίτημα.

Ελέγξτε και το όριο λήψης. Διαβάστε την πλήρη απόκριση του proxy πριν παραδώσετε το socket στο TLS, χειριστείτε μερικές αναγνώσεις και διατηρήστε ό,τι διαβαστεί πέρα από τις κεφαλίδες. Μία ανάγνωση socket δεν χρειάζεται να περιέχει ένα ολόκληρο μήνυμα.

Αν σας ανήκει αυτός ο parser, συγκρίνετε μια επεξεργασμένη αναπαράσταση bytes με τη γραμματική του σύρματος· κρατήστε μήκη και όρια γραμμών ορατά κρύβοντας τον κωδικό πρόσβασης. Για μια εφαρμογή που χρειάζεται μόνο σύνδεση proxy, ένας συντηρούμενος connector αποφεύγει την ανάγκη να κατέχετε αυτόν τον κώδικα πλαισίωσης.

Σχετικά άρθρα