SQL注入的简单例子

直接在SQL查询语句拼接查询参数

def getUsers(user_id):
    conn = psycopg2.connect("dbname='demo1' user='postgres' host='127.0.0.1' password='admin'")
    cur = conn.cursor()
    if user_id == None:
        str = 'select distinct * from company'
    else:
        str = 'select distinct * from company where id=%s' % user_id
    print str
    res = cur.execute(str)
    res = cur.fetchall()
    conn.close()
    return res

在这里插入图片描述
破坏者输入:‘1’ OR ‘1’ = '1’将查询出该表的所有数据!
最后的SQL语句:

select distinct * from company where id='1' OR '1' = '1'

where条件实际结果变成了False or True,成功盗取该表所有数据!

一种解决示例:使用列表/元组传入参数

def getUsers(user_id):
    conn = psycopg2.connect("dbname='demo1' user='postgres' host='127.0.0.1' password='admin'")
    cur = conn.cursor()
    if user_id == None:
        str = 'select distinct * from company'
    else:
        str = 'select distinct * from company where id=%s'
    print str
    res = cur.execute(str, [user_id])	# 使用参数替换直接拼接
    res = cur.fetchall()
    conn.close()
    return res

在这里插入图片描述
实际使用记得try处理一下异常

### SQL 注入攻击基本示例 SQL 注入是一种常见的安全漏洞,允许攻击者通过输入恶意的 SQL 查询来操纵数据库操作。以下是几种典型的 SQL 注入攻击实例: #### 1. 基于布尔的 SQL 注入 当应用程序未正确验证用户输入时,攻击者可以通过构造特定条件使查询返回不同的结果集。例如,在登录表单中提交用户名 `admin` 和密码 `' OR '1'='1` 可能会绕过身份验证逻辑[^2]。 假设原始查询如下所示: ```sql SELECT * FROM users WHERE username = '$username' AND password = '$password'; ``` 如果 `$username=admin` 并且 `$password=' OR '1'='1`, 则最终执行的查询变为: ```sql SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'; ``` 这将始终评估为真并可能授予未经授权访问权限。 #### 2. 工具调用注入 (Function Call Injection) 某些情况下,攻击者可以利用函数调用来获取敏感数据或破坏系统完整性。比如向 URL 参数附加字符串 `%27 UNION SELECT NULL, version(), database(); --` 能够揭示服务器上运行的具体版本号以及当前使用的数据库名称[^1]。 原请求可能是这样的形式: ```http GET /vulnerable-script.php?id=10 HTTP/1.1 Host: example.com ``` 而被篡改后的有效载荷则变成这样子: ```http GET /vulnerable-script.php?id=-1 UNION SELECT NULL, version(), database(); -- HTTP/1.1 Host: example.com ``` 此技术依赖于目标脚本未能过滤掉特殊字符如分号(`;`)或者连字符(`--`)等语法成分[]^1]^. #### 防护措施建议 为了防止上述类型的攻击发生,开发者应该采取诸如预处理语句(prepared statements), 输入校验(input validation),最小化特权原则(least privilege principle)等一系列最佳实践方法来增强应用安全性.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值