【问题标题】:set a variable as stringvar.get()将变量设置为 stringvar.get()
【发布时间】:2015-05-25 22:02:34
【问题描述】:

我有一个问题,我有一个进行选择查询的代码:

loginquery = "SELECT * from User "
loginquery = loginquery + "WHERE UserName="+ loginVar.get() +" AND Password="+ passVar.get()+""

问题在于结果是 SELECT * from User WHERE UserName= AND Password=

我该如何解决这个问题?

编辑:::::

这是我的代码

loginquery = ("SELECT * from User "
              "WHERE UserName=%s AND Password=%s")
bobby = (loginVar.get(),passVar.get())

我愿意

(query.execute(loginquery % bobby)

我的打印结果是:

SELECT * from User WHERE UserName=usernameentered AND Password=passwordentered

然而mysql连接器出现了这个错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND Password=' at line 1

这是为什么呢?

【问题讨论】:

  • 你能说得更具体些吗
  • @davi 他在谈论一种特定类型的 SQL 攻击,你也让自己容易受到攻击。如果恶意用户拥有凭据并且知道您的表名,他可以将loginVar 设置为他的用户名,并将passVar 设置为<password>; DROP TABLE <tablename>;,您的代码将删除整个表。
  • 我明白这一点,但现在我不想让它安全,我只是想让它工作
  • 嗯,你没有用分号结束你的查询,所以这就是问题......
  • 没有结束我只是用分号和同样的错误结束了它@Adam Smith

标签: python mysql python-3.4


【解决方案1】:

您应该在字符串文字周围添加引号:

loginquery = ("SELECT * from User "
              "WHERE UserName='%s' AND Password='%s'")

【讨论】:

  • 不,它会在上面添加引号,所以结果是:SELECT * from User WHERE UserName='' AND Password=''
  • 当我添加这些而不是给我那个错误时,它会让我立即失败'def LoginPress(): if(query.execute(loginquery % bobby)): print(loginquery % bobby) db .commit() print ("LOGGED IN!") else: print(loginquery % bobby) db.commit() print ("Failure!!") '
  • 这意味着您的loginVar.get()passVar.get() 方法返回空字符串。这与您需要引号这一事实无关。
  • 我设法输入了适当的输入:SELECT * from User WHERE UserName=asdasd AND Password=asd 但是我现在仍然收到此错误 'mysql.connector.errors.ProgrammingError: 1054 (42S22) :“where子句”中的未知列“asdasd”'@Selcuk
  • 那是因为你省略了引号。没有引号,数据库服务器认为它是一个列名。
猜你喜欢
  • 2021-11-01
  • 2010-11-04
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多