我可以在网上找到关于动态创建参数化查询的正确和安全方式的大量信息。但是,这些网站只讨论where子句的参数化。
那么,sql语句的其他子句呢?请参阅以下内容:
string sql = string.Format(@"
SELECT MIN(TableName) as TableName, {0}
FROM
(
SELECT 'Table A' as TableName, {0}
FROM {1}
UNION ALL
SELECT 'Table B' as TableName, {0}
FROM {2}
) tmp
GROUP BY {0}
HAVING COUNT(*) = 1", columnList, tableA, tableB);
我正在构建一个声明,其中已经参数化了以下内容:
问题: 这对sql注入有多么容易受到伤害?
我无法想到无论如何恶意黑客可以注入sql,这将导致正确形成的可执行sql。但话说回来,我不是一个SQL专家。
答案 0 :(得分:5)
这实际上取决于from tkinter import *
import time
import threading
main = Tk()
def threadspawner():
global var1
global var2
print(var1)
if var1.get() == 2:
thread1 = threading.Thread(target=lambda: loader(lbl1, 'on')) #<-- starts the spinning wheel to show that something is happening
thread1.start()
time.sleep(1) #start doing stuff here
loader(lbl1, 'off') #<-- Turns off the spinning wheel
thread1.join()
if var2.get() == 2:
thread2 = threading.Thread(target=lambda: loader(lbl1, 'on')) #<-- starts the spinning wheel to show that something is happening
thread2.start()
time.sleep(2)
loader(lbl2, 'off')#<-- Turns off the spinning wheel
thread2.join()
var1 = IntVar()
chk1 = Checkbutton(main, text='process1', onvalue=2, offvalue=0, variable=var1)
chk1.grid(row=1)
lbl1 = Label(main, text='')
lbl1.grid(row=1, column=1)
var2 = IntVar()
chk2 = Checkbutton(main, text='process2', variable=var2)
chk2.grid(row=2)
lbl2 = Label(main, text='')
lbl2.grid(row=2, column=1)
strt = Button(main, text='Start', command=lambda: threading.Thread(target=lambda: threadspawner()).start())
strt.grid(columnspan=2)
def loader(label, switch):
global lbl1
global lbl2
#im using images for my program but you do not have them so I use keyboard entries below to represent
#img = PhotoImage(file='icons\\wheel.gif', format="gif -index 0")
#img1 = PhotoImage(file='icons\\wheel.gif', format="gif -index 1")
#img2 = PhotoImage(file='icons\\wheel.gif', format="gif -index 2")
if switch == 'off':
label['text'] = '✓'
return
if switch == 'on':
print('starting loop')
if switch == 'on':
label['text'] = '/'
time.sleep(.1)
if switch == 'on':
label['text'] = '-'
time.sleep(.1)
if switch == 'on':
label['text'] = '\\'
time.sleep(.1)
if switch == 'on':
loader(label, 'on')
main.mainloop()
,columnList
和tableA
的来源。如果它们来自您的代码,没有用户输入,那么它非常安全。如果用户指定了表名,则必须准备好满足Little Bobby Tables。
在我公司的主要c#应用程序中,我们使用类似的方法来声明列,但SQL表中的列是在该表的类中定义的,因此我们可以构建select,add,update和create table strings从那个班级。用户永远不会定义这些列。
答案 1 :(得分:2)
正如@Andrew在答案中所述,如果参数不受任何用户输入的影响,或者以其他方式得到验证/清理,那么它应该没问题。
回答你关于可能正确形成的SQL语句的观点...引起关注的唯一区域是潜在的转义字符(例如分号,技术上可以放在命令块中的任何位置)和/或某些东西在声明的{1}
和{2}
部分形成了良好的形式。