SQLyog如何创建数据库,详细教程,SQLyog如何创建数据库,你知道怎么操作吗?下面将详细介绍......
如何避免 SQL 注入攻击
如何避免 SQL 注入攻击?
工具/原料
- IntelliJ IDEA
- mysql
方法/步骤
如果您有重复运行的特定查询, 数据库可以帮助准备查询, 这将导致更快、更安全的查询。
查询参数的使用允许数据库编译和准备查询, 然后您可以通过提供参数来执行实际查询。下图显示了这一方法的工作原理:
@Testpublic void queryParameters() throws SQLException { Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mytest", "root", "root"); PreparedStatement pStmt = conn.prepareStatement("insert into office_locations " "values (?,?,?,NULL)"); MapString,String> locations = new HashMapString,String>(){{ put("London","Picadilly Square"); put("New York","Union Plaza"); put("Paris","Revolution Place"); }}; int i = 1; for (String location : locations.keySet()) { pStmt.setString(3,locations.get(location)); pStmt.execute(); i ; } pStmt.close(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select count(*) from office_locations" "where location_name in ('London','New York','Paris')"); Assert.assertTrue(rs.next()); rs.next(); stmt.close();}
在上一节中, 查询是使用Statement对象执行的, 但在这种情况下, 查询使用PreparedStatement对象。创建PreparedStatement时, 需要提供要运行的查询。您打算在不同的查询调用中更改的参数将显示为问号。
对于每个查询执行, 都可以使用 setXXX 方法设置参数, 以标识查询的数据类型。您可以看到, 这是结果集中的 getXXX 方法的镜像。同样, 请注意, 参数是从1而不是从零编制索引的。
将 setXXX 方法与特定的数据类型一起使用, 而不是将参数值硬编码为 string, 可提供一定程度的安全性, 使其免受 SQL 注入等攻击。
假设您有一个 web 服务, 该服务显示数据库表的内容, 具体取决于某个列的 ID。您可以预期该 URL 看起来类似/showResults?id=3。简单实现此功能可以获取已分析的查询参数, 并将其直接传递到查询中的数据库:
stmt.executeQuery("select * from records where id = " queryParameters.get("id"));
但是, 恶意用户可以将 id 参数值替换为 3;DROP TABLE USERS;。这将使前面的代码运行两个查询:
SELECT * FROM records WHERE id = 3; DROP TABLE ures;
如果你不走运, 有一个名为用户的表, 它将刚刚被删除。相反, 如果此查询是使用 "PreparedStatement" 执行的:
PreparedStatement ps = conn.prepareStatement("select * from records where id= ?");ps.setInt(1,queryParameters.get("id"));ps.execute();
当查询参数尝试将值设置为 int 时, 它将在运行时失败, 但有异常, 因为恶意字符串不是 int。
您应该始终对数据库输入进行消毒, 并且应始终在可能的位置使用类型系统。
以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!
相关文章
- 详细阅读
- 详细阅读
-
如何处理'mysql' 不是内部或外部命令的报错详细阅读
如何处理mysql 不是内部或外部命令的报错,今天安装myql-5.7.23,想要从命令行中连接myql,结果出现如图报错。下面来写下,这种报错的解决方式:......
2023-03-16 500 MYSQL