לדלג לתוכן

8.7 קוד בטוח הרצאה

הפונקציה המובנית eval

  • הפונקציה המובנית eval מריצה שורת קוד פייתון
    while True:
        expr = input("> ")
        eval(expr)
    
  • אנחנו יכולים להשתמש בeval כדי ליצור מחשבון!
    def calculate_expression(expression):
        try:
            result = eval(expression)
            print(f"Result of '{expression}': {result}")
        except Exception as e:
            print(f"Error evaluating expression: {e}")
    
    # User input (simulated)
    user_expression = input("Enter a mathematical expression: ")
    
    # Using eval() to calculate and display the result
    calculate_expression(user_expression)
    
  • בנינו מחשבון מטורף תוך כמה שורות קוד פייתון פשוטות, מה הבעיה בקוד הזה?
  • הקוד הזה פגיעה לחולשת הרצת קוד, כל בן אדם שמשתמש בתוכנה הזו יכול לנצל את הקוד הזה כדי להריץ איזה קוד פייתון שהוא רוצה.
  • הנה דוגמה לשורה שתגרום לכך שמישהו יכול להריץ פקודת טרמינל על המחשב שלי
    __import__('os').system("dir")
  • מסקנה - לעולם אל תשתמשו בeval, או בכל פונקציה שעלולה להריץ קוד, תמיד נרצה לכתוב קוד בטוח.

הזרקת SQL

הזרקת SQL או באנגלית SQL Injection, או בקיצור - SQLI מאפשר למשתמש התוכנה להזריק שאילתות SQL ובכך לשבור את התוכנה שלנו ולנצל אותה.

import sqlite3

def login(username, password):
    conn = sqlite3.connect('users.db')
    c = conn.cursor()

    # Vulnerable SQL query
        query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"

    c.execute(query)
    user = c.fetchone()

    if user:
        print("Login successful!")
    else:
        print("Login failed!")

    conn.close()

if __name__ == "__main__":
    username = input("Enter username: ")
    password = input("Enter password: ")
    login(username, password)

- התוכנה הבאה מבקשת שם משתמש וסיסמא, אחרכך לפי השם משתמש והסיסמא שהכנסו היא בודקת בDB האם מה שהכנסו קיים, אם נמצא משהו בDB, התוכנה תתן לנו להכינס, אם לא אז התוכנה לא תתן לנו להיכנס.
- הקוד הזה פגיע לSQL INJECTION, אם כקלט של התוכנה נכניס לה שאילתת SQL, היא תרוץ - דוגמה לשאילתה שאפשר להכניס:
' or 1=1
- אם נכניס את השאילת הזו השאילת שתתקבל היא
SELECT * FROM users WHERE username='amit' AND password='' or 1=1

- השאילתה הזו תחזיר תוצאה, ובכך תתן לנו גישה לתוכנה.
- מסקנות:
- אף פעם אל תסמוך על הקלט שאתה מקבל מהמשתמש, תמיד תפלטר אותו.
- אל תשתמש בשאילתות SQL ככה בצורה גלוייה בקוד, תשתמש בORM

כתיבת קוד בטוח בפייתון

  • כמו חולשות של הרצת קוד מ-eval, יש עוד הרבה טכניקות ל"פריצה" של תוכנות, ככל שתמשיכו ללמוד תכנות כך תגלו עוד המון סוגים של פירצות שאפשר לעשות לקוד שלכם.
  • ככל שהקוד גדול יותר, כך גדלים הסיכויים למצוא חולשות. תמיד תניחו שבקוד שלכם יש חולשות אבטחה שצריך לתקן.