当前位置: 首页 > 面试题库 >

我应该如何在pysqlite中参数化列名以避免SQL注入

童浩言
2023-03-14
问题内容

我希望用户能够选择显示的订单结果(例如按年龄),并且我不想在从数据库中获取它们后对其进行排序。

显然,如果用户能够指定影响SQL命令的输入,则需要对其进行过滤,并且我通常会使用参数化,但是pysqlite似乎会忽略除值以外的任何参数。

下面的示例代码显示了不适用于的参数设置ORDER BY,以及使用字符串格式的解决方法,但这种方法容易受到SQL注入的攻击。

建议的解决方案是什么,以允许用户输入在不暴露SQLi漏洞的情况下影响排序顺序?我是否必须使用字符串格式并手动检查每个用户输入?

#!/user/bin/env python3

import sqlite3

con = sqlite3.connect(':memory:')
cur = con.cursor()
cur.execute('CREATE TABLE test (name, age)')
cur.execute('INSERT INTO test VALUES (:name, :age)', {'name': 'Aaron', 'age': 75})
cur.execute('INSERT INTO test VALUES (:name, :age)', {'name': 'Zebedee', 'age': 5})

cur.execute('SELECT * FROM test ORDER BY age ASC')
results = cur.fetchall()
print('\nGood, but hard coded:\n', results)
# Good, but hard coded:
#  [('Zebedee', 5), ('Aaron', 75)]

cur.execute('SELECT * FROM test ORDER BY :order_by ASC', {'order_by': 'age'})
results = cur.fetchall()
print('\norder_by parameter ignored:\n', results)
# order_by parameter ignored:
#  [('Aaron', 75), ('Zebedee', 5)]

cur.execute('SELECT * FROM test ORDER BY {order_by} ASC'.format(order_by='age'))
results = cur.fetchall()
print('\nRight order, but vulnerable to SQL injection:\n', results)
# Right order, but vulnerable to SQL injection:
#  [('Zebedee', 5), ('Aaron', 75)]

con.close()

问题答案:

SQL参数仅用于值。其他任何事情都可能改变查询的含义。(例如,ORDER BY password可能会留下提示ORDER BY (SELECT ... FROM OtherTable ...)。)

为了确保来自客户端的列名有效,您可以使用白名单:

if order_by not in ['name', 'age']:
    raise ...
execute('... ORDER BY {}'.format(order_by))

但是将字符串集成到查询中仍然是一个坏主意,因为验证和实际表可能不同步,或者您可能忘记了检查。最好从客户端返回一个列索引,以便您使用的实际字符串始终是您自己的,并且在正常测试期间可以轻松发现任何错误:

order_by = ['name', 'age'][order_index]
execute('... ORDER BY {}'.format(order_by))


 类似资料:
  • 问题内容: 我使用一个简单的cms作为我网站的后端,在那里我可以更新新闻等。我想对SQL注入安全,所以我想知道这段代码是否被认为是安全的,或者是否可以做一些使其更安全的事情: 谢谢,祝你有美好的一天! 问题答案: 您没有在消毒 。 做一个就可以了,或(更好)拒绝共处理如果ID不是整数(假设ID是一个字段)。

  • 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的

  • 本文向大家介绍Java Web 如何避免 SQL 注入?相关面试题,主要包含被问及Java Web 如何避免 SQL 注入?时的应答技巧和注意事项,需要的朋友参考一下 使用预处理 PreparedStatement。 使用正则表达式过滤掉字符中的特殊字符。

  • 本文向大家介绍什么是sql注入?如何避免sql注入?相关面试题,主要包含被问及什么是sql注入?如何避免sql注入?时的应答技巧和注意事项,需要的朋友参考一下 用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。 详细参考复习ppt。举例子,摆事实! 1' or 1=1

  • 问题内容: 在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入。下面是示例代码,我尝试使用它来避免它,但是它不起作用。谁能告诉我如何纠正它? 输出:打印消息: 所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。 问题答案: 您可以将表名包含在 但是,如果使用两部分命名约定,例如,则必须添加其他解析,因为这将导致: 无效的对象名称[dbo.tablena

  • 问题内容: 我想在Ubuntu 8.10上使用JNI,并使用Eclipse和gcc(如果有风味,请在Ubuntu上使用标准版本)。 尽管make文件成功创建了库,但似乎无法加载我的库。 主要的Java类如下: 我的make文件就是这样; 其余的代码(Hello.c)看起来像是会想到的。 我得到的错误如下: 如果我使用显式路径: 然后就可以了,但是如果可能的话,我宁愿不使用显式路径。 问题答案: 按