首页 > 解决方案 > 从 Python 获取输入以在 SQL 查询中使用并将结果返回到屏幕

问题描述

我有一个 python 应用程序,我试图从 MSSQL 数据库返回结果,该数据库从输入到 python 应用程序中的输入派生

我已经连接到 SQL 数据库,如果输入行号,可以返回行。

# Select IP
input_var = input("Enter IP Address: ")

def IP_Search():
    cursor.execute("SELECT IP, Location, Description, Project, OS, DNS, NETBIOS, MAC FROM [IPAM].[dbo].[Sheet1$] WHERE IP=(?)" (input_var)) 
        row = cursor.fetchall()
        while row: 
            print(IP_Search)
            row = cursor.fetchall()

我希望它选择与用户输入的 ip 地址匹配的记录

标签: sql-serverpython-3.x

解决方案


更新以解决 sql 注入攻击。

您需要格式化字符串,有几种方法可以做到这一点。

python 中当前的最佳实践是使用新的格式字符串。字符串前面的 f 让 python 知道您想要格式化字符串并{input_var}告诉 python 您想要用变量 input_var 的值替换它。

def IP_Search(input_var): 
    cursor.execute(f"SELECT IP, Location, Description, Project, OS, DNS, NETBIOS, MAC FROM [IPAM].[dbo].[Sheet1$] WHERE IP={input_var}") 
    row = cursor.fetchall() 
    while row:
        print (IP_Search)
        row = cursor.fetchall()

input_var = input("Enter IP Address: ")
IP_Search(input_var)

正如评论中指出的那样,这使得数据库容易受到 SQL 注入攻击。您可以在此处查看详细信息:https ://bobby-tables.com/python

相反,您所做的是将变量传递给cursor.execute函数,如下所示:

def IP_Search(input_var): 
    cursor.execute("SELECT IP, Location, Description, Project, OS, DNS, NETBIOS, MAC FROM [IPAM].[dbo].[Sheet1$] WHERE IP=%s", (input_var,)) 
    row = cursor.fetchall() 
    while row:
        print (IP_Search)
        row = cursor.fetchall()

input_var = input("Enter IP Address: ")
IP_Search(input_var)

推荐阅读