首页 > 软件开发 > MYSQL >

如何避免 SQL 注入攻击

来源:互联网 2023-03-16 22:57:55 版权归原作者所有,如有侵权,请联系我们

如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

工具/原料

  • IntelliJ IDEA
  • mysql

方法/步骤

  • 1

    如果您有重复运行的特定查询, 数据库可以帮助准备查询, 这将导致更快、更安全的查询。AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 2

    查询参数的使用允许数据库编译和准备查询, 然后您可以通过提供参数来执行实际查询。下图显示了这一方法的工作原理:AMT办公区 - 实用经验教程分享!

    @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();}AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 3

    在上一节中, 查询是使用Statement对象执行的, 但在这种情况下, 查询使用PreparedStatement对象。创建PreparedStatement时, 需要提供要运行的查询。您打算在不同的查询调用中更改的参数将显示为问号。AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 4

    对于每个查询执行, 都可以使用 setXXX 方法设置参数, 以标识查询的数据类型。您可以看到, 这是结果集中的 getXXX 方法的镜像。同样, 请注意, 参数是从1而不是从零编制索引的。AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 4该信息未经授权抓取自百度经验
  • 5

    将 setXXX 方法与特定的数据类型一起使用, 而不是将参数值硬编码为 string, 可提供一定程度的安全性, 使其免受 SQL 注入等攻击。AMT办公区 - 实用经验教程分享!

  • 6

    假设您有一个 web 服务, 该服务显示数据库表的内容, 具体取决于某个列的 ID。您可以预期该 URL 看起来类似/showResults?id=3。简单实现此功能可以获取已分析的查询参数, 并将其直接传递到查询中的数据库:AMT办公区 - 实用经验教程分享!

    stmt.executeQuery("select * from records where id = " queryParameters.get("id"));AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 7

    但是, 恶意用户可以将 id 参数值替换为 3;DROP TABLE USERS;。这将使前面的代码运行两个查询:AMT办公区 - 实用经验教程分享!

    SELECT * FROM records WHERE id = 3; DROP TABLE ures;AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 8

    如果你不走运, 有一个名为用户的表, 它将刚刚被删除。相反, 如果此查询是使用 "PreparedStatement" 执行的:AMT办公区 - 实用经验教程分享!

    PreparedStatement ps = conn.prepareStatement("select * from records where id= ?");ps.setInt(1,queryParameters.get("id"));ps.execute();AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 9

    当查询参数尝试将值设置为 int 时, 它将在运行时失败, 但有异常, 因为恶意字符串不是 int。AMT办公区 - 实用经验教程分享!

  • 10

    您应该始终对数据库输入进行消毒, 并且应始终在可能的位置使用类型系统。AMT办公区 - 实用经验教程分享!

    如何避免 SQL 注入攻击?AMT办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!AMT办公区 - 实用经验教程分享!


    标签: SQLMYSQL

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号