当前位置: 首页 > 知识库问答 >
问题:

SQL注入漏洞

赵华彩
2023-03-14

像这样的陈述

String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

符合SQL注入条件。但PreparedStatement如何帮助防止SQL注入呢?考虑以下场景:

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

如果有人输入userId="abc"密码="1=1"怎么办,因为这也将被视为有效的字符串...

共有3个答案

柯轶
2023-03-14

在第二个例子中,

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users"
    + " WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

如果有人输入userId="abc"和密码="1=1"怎么办,因为这也将被视为有效的字符串...

答案是肯定的,但正确转义的字符串文字。因此,密码必须为1=1才能起作用。需要明确的是,它不受SQL注入的约束,因为这些变量是正确绑定的。

根据准备tatement.set字符串(int, String)Javadoc粗体添加,

将指定参数设置为给定的Java字符串值。驱动程序在将其发送到数据库时将其转换为SQLVARCHAR或LONGVARCHAR值(取决于参数相对于驱动程序对VARCHAR值的限制的大小)。

益麻雀
2023-03-14
    String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";

在这里,如果您试图演示sql注入,密码的值可能类似:“或1=1或“”=”

然后,发送到DB server执行的结果SQL是-

SELECT * FROM users WHERE userid ='abc' AND password='' OR 1=1 OR ''=''

所以它从表中选择所有条目,而不管用户ID和密码是什么,因为用户ID='abc'和密码=''或1=1或'=''始终为真。任何未经授权的人都可以访问所有用户的数据。

在使用参数化准备语句的第二个语句的情况下-

它将在表中搜索userid=“abc”和password=“”或1=1或“”=”的条目

由于准备好的语句是在DB server中预编译的,即首先从userid=?和密码=?将发送到服务器,然后服务器将对其进行编译,然后将数据(参数)分别发送到db(执行时)。JDBC驱动程序将密码='或1=1或'='等数据作为字符串文本发送。然后DB server强制将其用作有效参数,而不是sql查询。

邢财
2023-03-14

这保护您的确切方式取决于数据库,但有两个明显的选项:

  • 数据库驱动程序可以执行字符串插值并生成SQL语句,以确保所有参数都正确转义
  • 数据库驱动程序可以完全按照您指定的方式将SQL传递给数据库,并通过一个完全独立的通道传递参数值,而不需要任何转义,因为它只包含值

在我看来,后者是一个更明智的解决方案,因为它允许数据库非常简单地缓存查询计划,认识到除了参数值之外,两个查询完全相同。我希望任何现代数据库都能在其本机通信协议中支持这一点。

 类似资料:
  • 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理与危害 SQL 注入就是指,在输入的字符串中注入 SQL 语句,如果应用相信用户的输入而对输入的字符串没进行任何的过滤处理,那么这些注入进去的 SQL 语句就会被数据库误认为是正常的 SQL 语句而被执行。 恶意使用 SQL 注入攻击的人可以通过构建不同的 SQL 语句进行脱裤、命令执行、写 Webshell、读取度武器

  • 本文向大家介绍PHPCMS2008广告模板SQL注入漏洞修复,包括了PHPCMS2008广告模板SQL注入漏洞修复的使用技巧和注意事项,需要的朋友参考一下 00 漏洞描述 PHPCMS2008由于广告模块取referer不严,导致一处sql注入漏洞.可以得到管理员用户名与密码,攻击者登录后台后可能会获取webshell,对服务器进行进一步的渗透。 01 漏洞分析 漏洞产生的位置: /ads/inc

  • 主要内容:SQL 注入的危害,SQL 注入示例,防止 SQL 注入SQL 注入是一种代码渗透技术,是最常用的网络黑客技术之一。SQL 注入非常危险,可能会导致数据库中的数据被暴露,甚至被损坏。 通过网页输入框(<input> 标签、<textarea> 标签等)将恶意 SQL 代码提交给服务器是最常见的 SQL 注入方式之一。 当网站要求输入诸如用户名(用户ID)之类的内容时,通常会发生 SQL 注入。黑客会输入一条 SQL 语句,而不是用户名/用户ID,当页面

  • 有使用 SQL 语句操作数据库的经验朋友,应该都知道使用 SQL 过程中有一个安全问题叫 SQL 注入。所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。 为了防止 SQL 注入,在生产环境中使用 OpenResty 的时候就要注意添加防范代码。 延续之前的 ngx_postgres 调用代码的使用,

  • 我一直在尝试在我们的Spring应用程序中处理log4j2的安全性以传递Veracode。尤其是CWE 117-日志注入漏洞。我们有一个带有spring-boot-starter-log4j2的Spring应用程序。 我尝试配置log4j2模式: 但它不起作用。我还尝试了这样的方法: 或 我仍然得到veracode结果: 我们不想使用ESAPI或任何日志外观,我们不想更改代码中的所有日志行,有数千

  • 问题内容: 我正在尝试(合法地)利用具有SQLi漏洞的MariaDb数据库。 我在这里发现了漏洞… 将是脆弱的,并产生下列错误… 我正在使用Burp Suite,并采用了以下语法,该语法似乎更接近商标,但仍会产生语法错误。 我认为它离商标更近了,因为错误只会吐出我介绍的查询,而不是“额外”字段:。 我假设这是原始查询的一部分,因为它包含在内,当我使用其他随机字符串进行测试时,它仍然为真。 我从页面