91 lines
3.5 KiB
Python
91 lines
3.5 KiB
Python
# 5. What does this do? print("\007") Can you figure out why?
|
|
|
|
# It is a ASCII Bell character.
|
|
# It generates a beep sound or a system alert depending on the platform and environment where the code is executed.
|
|
# It is often used to trigger attention or alert the user in certain situations or as a way to generate a simple sound signal in text-based interfaces.
|
|
|
|
# BUT NOTHING HAPPENED ON MAC.
|
|
|
|
|
|
|
|
# 6. What does this do? print("abcdefg\rhijklmnop") Can you figure out why?
|
|
|
|
# '\r' is a carriage return character
|
|
# When the string is printed, the carriage return character '\r' causes the cursor to return to the beginning of the line.
|
|
# So when "hijklmnop" is printed, the cursor moves back to the start of the line, and the subsequent text "abcdefg" overwrites the initial characters.
|
|
|
|
# The output is gonna be 'hijklmnop'.
|
|
|
|
|
|
|
|
# 7. To shut down the HTTP server afterward, using Ctrl + C to interrupt the execution of the Python program.
|
|
|
|
import http.server
|
|
import socketserver
|
|
from urllib.parse import urlparse, parse_qs
|
|
|
|
class MyRequestHandler(http.server.SimpleHTTPRequestHandler):
|
|
def do_GET(self):
|
|
self.send_response(200)
|
|
self.send_header('Content-type', 'text/plain')
|
|
self.end_headers()
|
|
output_string = "abcdefg\rhijklmnop"
|
|
self.wfile.write(output_string.encode())
|
|
|
|
PORT = 8000
|
|
Handler = MyRequestHandler
|
|
httpd = socketserver.TCPServer(("", PORT), Handler)
|
|
print(f"Serving on port {PORT}")
|
|
|
|
httpd.serve_forever()
|
|
|
|
# The HTTP server sends the response over the network to the client, which is typically a web browser.
|
|
# In this function, the server sends an HTTP response with a status code of 200 and a content type of "text/plain".
|
|
# The response body is set to the string "abcdefg\rhijklmnop" encoded as bytes.
|
|
# When the client receives this response, it interprets the \r character as a normal character and displays the entire string "abcdefg\rhijklmnop" as it is.
|
|
|
|
# The '\r' character is a carriage return character, which is a control character used to return the cursor to the beginning of the current line.
|
|
# The behavior of the carriage return character '\r' can depend on the platform and how the output is handled.
|
|
|
|
# For example:
|
|
# In Safari and Chrome, the "http://localhost:8000" shows:
|
|
# abcdefg
|
|
# hijklmnop
|
|
# In Macbook Terminal, the "curl http://localhost:8000" shows:
|
|
# hijklmnop%
|
|
|
|
|
|
|
|
# 8. Think of a way someone might try to commit a crime or hide an embezzlement scheme using the answers to the above two questions.
|
|
|
|
# The key is by manipulating or altering the output displayed on a web page versus what is actually happening in the system.
|
|
|
|
# Case 1:
|
|
# Show the false financial transactions to earn the cut.
|
|
# Case 2:
|
|
# Delivey the heist planning details and hide any suspicious activity.
|
|
# Case 3:
|
|
# Overwrite the previously displayed information for the false testimony purpose.
|
|
|
|
|
|
|
|
# 9. Think of how you would do input validation to prevent such a crime. Replace the code REPLACE ME here so the tests pass:
|
|
|
|
def validate(input_str):
|
|
if '\r' in input_str or '\n' in input_str:
|
|
raise ValueError("Crime detected!")
|
|
|
|
try:
|
|
validate("abcdefg")
|
|
print("✅ test1 pass!")
|
|
except ValueError:
|
|
print("❌ test1 fail!")
|
|
|
|
try:
|
|
validate("abcdefg\rhijklmnop")
|
|
print("❌ test2 fail!")
|
|
except ValueError:
|
|
print("✅ test2 pass!")
|
|
|
|
# Test 1 pass means there is no ValueError
|
|
# Test 2 pass means the ValueError has been detected |