网络安全-防止 SQL 注入

从编程角度来看,网络安全的一个重要案例是防止 SQL 注入攻击。这是一种常见但严重的安全漏洞,攻击者能够通过输入恶意的 SQL 代码来操控数据库,导致数据泄露或篡改。

以下是一个简单的示例,展示了如何从不安全的代码转变为安全的代码,以防止 SQL 注入:

不安全的示例

假设有一个简单的登录功能,代码如下:

import sqlite3

def login(username, password):
    connection = sqlite3.connect('users.db')
    cursor = connection.cursor()
    
    query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
    cursor.execute(query)
    result = cursor.fetchone()
    
    if result:
        print("Login successful!")
    else:
        print("Login failed!")

    connection.close()

username = input("Enter username: ")
password = input("Enter password: ")
login(username, password)

在这个示例中,攻击者可以输入如下内容作为用户名:

plaintext

' OR '1'='1

这样生成的 SQL 查询将会如下:

sql

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '<user_input_password>'

此查询将始终返回真,允许攻击者绕过身份验证。

安全的示例

为了防止 SQL 注入,我们应该使用参数化查询,而不是直接拼接用户输入到 SQL 查询中。修改后的代码如下:

import sqlite3

def login(username, password):
    connection = sqlite3.connect('users.db')
    cursor = connection.cursor()
    
    query = "SELECT * FROM users WHERE username = ? AND password = ?"
    cursor.execute(query, (username, password))  # 使用参数化查询
    result = cursor.fetchone()
    
    if result:
        print("Login successful!")
    else:
        print("Login failed!")

    connection.close()

username = input("Enter username: ")
password = input("Enter password: ")
login(username, password)

在安全版本中,使用参数化查询 cursor.execute(query, (username, password)),这可以有效地防止恶意输入从而避免 SQL 注入。数据库驱动程序会自动处理输入,确保它们不会被解释为 SQL 代码。

防止 SQL 注入是网络安全中的一个基本但重要的概念。通过使用参数化查询和其他安全编码实践,开发人员可以显著降低应用程序受到攻击的风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值