草庐IT

如果表中存在许可 key ,则 MySQL 代码将用户名和密码插入表中

coder 2023-07-01 原文

我正尝试在 golang 中完成一个简单的许可系统,并尝试了多种方法来让它工作。基本上,我在我的数据库中输入了几个随机许可 key ,我的 golang 程序应该检查用户输入的 key 是否存在,如果存在,然后将用户指定的用户名和密码添加到数据库中,以便稍后登录。

这是我没有用过的代码:

"IF EXISTS (SELECT * FROM login WHERE LK = "+reglicenceEntry.Text()+") THEN 
 INSERT INTO `login` (`Username`, `Password`, `LK`) VALUES 
 ('"+regusernameEntry.Text()+"', '"+regpasswordEntry.Text()+"', ''); "

这是 golang 错误:

Error 1064: 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 'IF EXISTS (SELECT * FROM login WHERE LK = '5qp515YHXEmSDzwqgoJh') THEN INSERT IN' at line 1

非常感谢!

最佳答案

MySQL 语法不支持 IF...THEN 结构,除了在存储的例程和触发器和事件中。参见 https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-compound-statements.html

我为您的代码建议了一个替代解决方案:

INSERT INTO `login` (`Username`, `Password`, `LK`)
SELECT ?, ?, ''
FROM `login`
WHERE `LK` = ?
LIMIT 1

如果您的登录表没有 LK 值,上面的 SELECT 将返回 0 行,因此它不会插入任何内容。

如果你的登录表有 LK 值,上面的 SELECT 将返回至少 1 行(我限制为 1),因此它会插入一行。它插入的行由您的用户名和密码以及 LK 的空白字符串组成。

我展示了参数占位符的使用。您应该在 SQL 中使用参数,而不是将变量连接到查询中。这是避免意外 SQL 注入(inject)的良好做法。参见 http://go-database-sql.org/prepared.html例如。


使用参数的目的是避免SQL注入(inject)问题。请参阅我对 What is SQL injection? 的回答SQL注入(inject)的解释。

或者我的介绍SQL Injection Myths and Fallacies (或 youtube video )。

使用参数时,您需要执行两个步骤。

  • 准备带有占位符 (?) 的查询的第一步,否则您会在其中将变量连接到 SQL 查询中。
  • 第二步是执行准备好的查询,这是你传递变量来填充占位符的时候。

关键是要将变量与您的查询分开,因此如果变量中有任何可能无意中更改您的 SQL 语法的内容(如不平衡的引号),它永远不会与 SQL 结合。做完prepare之后,SQL已经被MySQL服务器解析过了,之后的语法就没法改了。

MySQL 会记住查询的哪些部分需要填写,并且当您在执行步骤中传递变量时,MySQL 会使用您的值填写查询的缺失部分——但这发生在 MySQL 服务器中,而不是在您的服务器中应用。

因此,查询的动态部分(您的变量)与 SQL 语法保持分离,从而避免了 SQL 注入(inject)问题。

对于您在问题中描述的任务,它看起来像这样(我没有测试过这段 Go 代码,但它应该会让您走上正确的道路)。

stmt, err := tx.Prepare("INSERT INTO `login` (`Username`, `Password`, `LK`) SELECT ?, ?, '' FROM `login` WHERE `LK` = ? LIMIT 1")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

_, err = stmt.Exec(regusernameEntry.Text(), regpasswordEntry.Text(), reglicenceEntry.Text())
if err != nil {
    log.Fatal(err)
}

参数的顺序很重要。您传递给 Exec() 的变量的顺序必须与 ? 占位符在您准备好的 SQL 语句中出现的顺序相同。它们由 MySQL 服务器以相同的顺序一对一匹配。

不要在准备好的 SQL 语句中的占位符周围加上引号。这将作为 SQL 中的文字字符串 '?' 工作。使用不带引号的 ? 字符作为占位符。当它在服务器中被 MySQL 合并时,它的工作方式就像您在值周围加上引号一样,就像字符串一样——但没有 SQL 注入(inject)的风险,即使该字符串值包含特殊字符也是如此。

这是另一个提供更多代码示例的站点:https://github.com/go-sql-driver/mysql/wiki/Examples

Exec() 函数用于执行没有结果集的 SQL,如 INSERT、UPDATE、DELETE。 Go SQL 驱动程序中还有其他函数,如 Query()QueryRow() 也接受参数参数。如果您的 SQL 返回结果集,您将使用这些。

关于如果表中存在许可 key ,则 MySQL 代码将用户名和密码插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50202694/

有关如果表中存在许可 key ,则 MySQL 代码将用户名和密码插入表中的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  7. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  8. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  9. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐