什么是预处理?
预处理是指在代码执行之前对一些变量或数据进行处理,以提高程序性能和安全性。在编程中,预处理通常是指在运行程序之前编译或解析代码以减少运行时开销。
SQL预处理是指在执行SQL语句并将其发送到数据库之前,将SQL语句中的参数和变量转换为占位符(即“?”)。语句执行时,占位符会被替换为具体的参数值,并发送到数据库执行。该方法显着降低了SQL注入的风险,提高了SQL执行的效率。
防SQL注入的原理
1. 防止恶意代码注入的原则
SQL注入是指攻击者向Web应用程序注入恶意SQL代码,导致数据库执行恶意SQL语句。为了防止SQL注入,可以采用以下原则:
1. 使用参数化查询或准备好的语句。用占位符表示SQL 语句中的参数,并将实际参数值绑定到占位符。这可以防止攻击者将恶意SQL 代码注入到参数值中。
2. 过滤用户输入。过滤用户输入数据以删除或转义可能包含SQL 注入代码的特殊字符(例如单引号、双引号和分号)。
3.限制权限。在对数据库用户进行授权时,应根据用户的需求分配最小的权限,防止攻击者通过注入SQL语句获取敏感数据。
4. 验证用户输入。验证Web 应用程序中的用户输入,以确保输入数据满足您的要求,包括类型、长度和格式。
5. 使用防火墙。使用Web 应用程序防火墙(WAF) 监视和阻止恶意SQL 注入请求。 WAF可以识别并阻止或警告恶意SQL语句。
采取上述措施可以有效防止SQL注入攻击,保护您的Web应用程序和数据库的安全。
2. 模仿恶意代码并注入SQL语句
如果用户输入“任意值”或“1”=“1”作为变量的值,则没有预准备语句的SQL 语句将是:
SELECT * FROM users WHERE username=“any value” or “1”=“1” AND password=”$password”;
OR 运算符的优先级低于AND 运算符,因此上述语句等效于:
SELECT * FROM users WHERE (用户名=“任意值”) OR (“1”=“1” AND 密码=“$password”);
由于“1”=“1”始终为真,因此此条件匹配所有记录并返回所有用户记录。这是一种SQL 注入攻击。使用预准备语句时,即使将“任意值”或“1”=“1”作为参数值传递,生成的SQL 语句也会将字符串作为参数传递,而不会影响SQL 代码,只需将其传递给占位符即可。一个值。它没有影响并且避免了SQL注入攻击。
封装jdbc;
导入java.sql.*;
公共课圆顶2 {
public static void main(String[] args) 抛出ClassNotFoundException, SQLException {
//1. 加载并注册驱动程序。
Class.forName(\”com.mysql.cj.jdbc.Driver\”);
//2.创建连接字符
String URL=\”jdbc:mysql://127.0.0.1:3306/1127douyinDB\”;
字符串用户名=“root”;
字符串密码=“root”;
连接con=DriverManager.getConnection(url,用户名,密码);
//3. 创建连接对象。
语句sta=con.createStatement(); //新建
//4.编写SQL语句
//注意,注意,注意! “‘任何值’或‘1’=‘1’”此代码
string sql=\”更新抖音设置收入=150000 其中liveStreaming=\’任意值\’或\’1\’=\’1\’\”;
//5. 执行命令
int row=sta.executeUpdate(sql); //可用于添加、删除、修改。
//6. 处理结果
如果(第0 行){
System.out.println(\”修改操作成功!\”);
}除此之外{
System.out.println(\”修改操作失败!\”);
}
//7. 关闭资源
con.close();
con.close();
}
}
上面的示例使用“任意值”或“1”=“1”的方法来注入恶意SQL语句。恶意用户可以通过输入“任意值”或“1”=“1”来插入SQL语句。影响最终结果。
使用预处理来防止SQL被恶意插入。
使用prepared statements可以有效防止SQL注入攻击。以下是具体步骤:
1. 创建准备好的语句对象。
2. 创建SQL 语句并使用参数占位符代替实际参数。示例:SELECT * FROM 用户WHERE 用户名=? AND 密码=?
3. 绑定参数值。将实际参数值与参数占位符绑定,防止恶意代码注入。
4. 执行准备好的语句。当执行一条语句时,数据库将编译好的SQL语句和参数值组合起来形成完整的SQL语句并执行该语句。
下面是使用准备好的语句来防止SQL 注入的示例代码。
封装jdbc;
导入java.sql.*;
公共课圆顶3 {
public static void main(String[] args) 抛出ClassNotFoundException, SQLException {
//1. 加载并注册驱动程序。
Class.forName(\”com.mysql.cj.jdbc.Driver\”);
//2.创建连接字符
String URL=\”jdbc:mysql://127.0.0.1:3306/1127douyinDB\”;
字符串用户名=“root”;
字符串密码=“root”;
Connection 连接=DriverManager.getConnection(url,用户名,密码);
//3.定义SQL语句
string sql=\’更新抖音集收入=? where liveStreaming=?\’;
//输入
字符串收入=\’1000\’;
String liveStreaming=\’杨哥\’;
//4. 创建预处理对象
准备语句准备=连接.准备语句(sql);
准备.setString(1,收入);
prepar.setString(2,liveStreaming);
//5. 执行预处理对象
int row=prepar.executeUpdate(); //预处理
//6. 处理结果
如果(第0 行){
System.out.println(\’更改成功!\’);
}除此之外{
System.out.println(\’更改失败!\’);
}
//Statement和Connection对象(先打开,先关闭)
准备.关闭();
连接.close();
}
}
上面的示例使用了mysql 准备好的语句对象和方法。首先,使用prepare()方法创建一个准备好的语句对象。在SQL 语句中使用? 代替实际参数,并使用将实际参数值绑定到参数占位符的方法。最终生成的SQL 语句只是将字符串作为参数值传递给您的SQL 代码。影响。
学习资料分享
当然,只给出方案而不给出教材,无异于流氓行为。 ### 如果您有兴趣开始网络安全,请单击此处。 CSDN礼包:《黑客网络安全入门进阶学习资源包》免费分享。
如果您对网络安全感兴趣,我们的学习资源免费共享,并保证完全免费。 (Heyke入门教程)
全套网络安全(Heyke)学习视频
通过看视频学习的时候,理解并运用它们,而不是仅仅动动眼睛、动动脑袋,才是更科学的学习方法。
网安(嘿客红蓝对抗)所有方向的学习路线****
对于刚接触网络安全的学生,我们创建了详细的学习和成长路线图。这可以说是最科学、最系统的学习路线。每个人都可以遵循这个大方向。
学习资料工具包
盒子底部的丰富资源全面深入地介绍了基础网络安全理论,包括逆向工程、八层网络防御、汇编语言、白帽网络安全、密码学、网络安全协议等。它被集成到.基础理论与主流工具的应用实践。帮助读者了解各种主流工具背后的实现机制。
面试问题信息
我们的专用频道收集了京东、360、天融信等公司的试题。大工厂的入口就在拐角处!
嘿客必备开发工具
工欲善其事,必先利其器。学习黑客常用的开发软件都在这里了,节省了大家很多时间。
这份完整版的网络安全(嘿客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接也可扫描下方微信二v码获取网络工程师全套资料【保证100%免费】
如果你对网络安全入门感兴趣,那么你点击这里CSDN大礼包:《黑客网络安全入门进阶学习资源包》免费分享
#【网络安全渗透测试零基础初学者应该知道的事】以上关于SQL防御(非常详细)的信息足够收藏这篇文章了,从零基础到掌握。相关内容来源仅用于相关信息。请访问官方网站。演示将优先。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92205.html