mysql setstring 注入,SQL注入案例 - 我是小个子啊的个人空间 - OSCHINA - 中文开源技术交流社区...
时间: 2023-12-03 12:43:34 浏览: 168
很抱歉,我作为 AI 并不能访问互联网上的个人空间和文章。但是,我可以告诉你关于 SQL 注入的一些基础知识。
SQL 注入是一种常见的安全漏洞,攻击者可以通过输入恶意的 SQL 语句来获取或更改数据库中的数据。其中,setstring 注入是一种特殊的 SQL 注入方式,主要针对 Java 开发中使用的 setString() 方法。
setString() 方法是用于向 SQL 语句中添加字符串参数的,攻击者可以通过在参数中插入恶意的 SQL 语句来实现注入攻击。
例如,假设有一个登录页面,用户名和密码都是通过 setString() 方法添加到 SQL 语句中的,攻击者可以通过输入恶意的用户名和密码来实现 SQL 注入攻击,例如:
```
SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1';
```
这个 SQL 语句中的 OR '1'='1' 条件永远成立,所以会返回所有用户的信息,而不仅仅是管理员的信息。攻击者就可以通过这种方式获取到数据库中的敏感信息。
为了防止 SQL 注入攻击,开发人员应该使用参数化查询或者预编译语句来避免将用户输入的数据直接添加到 SQL 语句中。此外,还可以对输入数据进行验证和过滤,确保只有合法的数据才会传递到 SQL 语句中。
相关问题
package dao; import getConnection.GetConnection; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.*; import bean.User; public class DAO { private Connection conn; private PreparedStatement pstat; String sql = ""; /** * * 用户登录 */ public boolean logoin(User user) throws SQLException { conn = GetConnection.getConnection(); boolean i = false; sql = "select * from user where user=? and pwd=?"; pstat = conn.prepareStatement(sql); pstat.setString(1, user.getUser()); pstat.setString(2, user.getPwd()); ResultSet rs1 = (ResultSet) pstat.executeQuery(); if (rs1.next()) { i = true; rs1.close(); pstat.close(); } else { i = false; rs1.close(); pstat.close(); } conn.close(); return i; } /** * 用户注册 */ public void addUser(User user) { conn = GetConnection.getConnection(); sql = "insert into user values(?,?,?,?,?,?)"; try { pstat = conn.prepareStatement(sql); pstat.setString(1, null); pstat.setString(2, user.getUser()); pstat.setString(3, user.getPwd()); pstat.setString(4, user.getName()); pstat.setString(5, user.getxxx()); pstat.setInt(6, user.getAge()); pstat.executeUpdate(); pstat.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
这是一个 Java 类,用于与数据库交互,实现用户登录和注册功能。其中,logoin() 方法用于验证用户登录信息,addUser() 方法用于向数据库中添加新用户信息。这个类需要连接数据库,使用了 com.mysql.jdbc.* 以及 getConnection.GetConnection 类。在 logoin() 方法中,通过传入一个 User 对象,使用 PreparedStatement 对象执行 SQL 语句,从数据库中查询是否存在该用户信息,如果存在则返回 true,否则返回 false。在 addUser() 方法中,也是使用 PreparedStatement 对象,将用户信息插入到数据库中。
try { con=DriverManager.getConnection(url); String insertCondition="INSERT INTO users(username,password,sex,phone) VALUES (?,?,?,?)"; sql=con.prepareStatement(insertCondition); if(boo) { sql.setString(1,username); sql.setString(2,password); sql.setString(3,sex); sql.setString(4,phone); int m=sql.executeUpdate(); //判断数据是否存入数据库 if(m!=0) { backNews="注册成功"; //若存入则注册成功 userBean.setBackNews(backNews); userBean.setUsername(username); session.setAttribute("success", 1); } }
在这段代码中,如果用户没有填写性别和联系方式,则会直接跳过注册的过程,不会将数据存入数据库。如果需要进行联动注册,则可以修改代码,让用户必须填写性别和联系方式才能进行注册。
可以在这段代码中添加以下判断:
```
boolean isLD = true; // 联动注册:必须填写性别和联系方式才能注册
boolean boo = username.length()>0 && password.length()>0 && isLD && sex.length()>0 && phone.length()>0; // 用户名、密码、性别和联系方式不能为空
if (boo) {
con = DriverManager.getConnection(url);
String insertCondition = "INSERT INTO users(username, password, sex, phone) VALUES (?, ?, ?, ?)";
sql = con.prepareStatement(insertCondition);
sql.setString(1, username);
sql.setString(2, password);
sql.setString(3, sex);
sql.setString(4, phone);
int m = sql.executeUpdate(); // 判断数据是否存入数据库
if (m != 0) {
backNews = "注册成功"; // 若存入则注册成功
userBean.setBackNews(backNews);
userBean.setUsername(username);
session.setAttribute("success", 1);
}
}
```
这样,只有当用户填写了性别和联系方式,才能进行注册。如果没有填写,就不允许进行注册。
阅读全文