Java安全:如何保护代码免受SQL注入和XSS攻击

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何防止黑客入侵您的Java代码:深入剖析SQL注入和XSS



想象一下:您用Java编写了一个完美的Web应用程序。漂亮的界面、快速的逻辑、清晰的架构。您将其部署到服务器上,泡上一杯茶……一小时后却收到消息说数据库已被删除,主页上赫然显示着某个嚣张的ASCII艺术画。听起来熟悉吗?不幸的是,对许多开发者来说,答案是肯定的。



Web应用程序最常见的两种危险漏洞——SQL注入和跨站脚本攻击(XSS)——每年都让成千上万个网站的管理员夜不能寐。而Java,尽管以其严谨著称,也未能幸免。但好消息是:防范它们是完全可行的,而且并不复杂。



在本文中,我们将分析攻击者究竟如何攻击Java应用程序,更重要的是,如何利用经过验证的工具和正确的编码习惯建立可靠的防线。系好安全带:这里将包含大量代码、实用技巧,并且言简意赅。



SQL注入:当用户变成程序员



这是什么,为什么它会奏效?



SQL注入是一种攻击技术,攻击者通过用户输入将恶意SQL代码“注入”到查询中。如果应用程序不加思考地拼接字符串,攻击者就可能访问他人数据、删除表,甚至控制数据库服务器。



Java中糟糕代码的典型示例:



String userInput = request.getParameter("username");String query = "SELECT * FROM users WHERE username = '" + userInput + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);


如果用户输入:admin' OR '1'='1,会发生什么?查询会变成:



SELECT * FROM users WHERE username = 'admin' OR '1'='1'


条件 '1'='1' 始终为真。恭喜:攻击者甚至不知道密码就作为管理员登录了系统。而如果他输入 '; DROP TABLE users; --——那就全完了。



如何防范:PreparedStatement——您的盾牌



Java应用程序安全的第一条规则:永远不要将用户数据与SQL查询拼接在一起。请使用通过 PreparedStatement 实现的参数化查询。



安全代码应该如下所示:



String userInput = request.getParameter("username");String query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, userInput);ResultSet rs = pstmt.executeQuery();


这里发生了什么?数据库分别接收查询和数据。即使 userInput 包含恶意的SQL代码,它也会被当作普通字符串处理,而不是命令。PreparedStatement 会自动转义特殊字符。这是第一道也是最重要的防线。



额外措施:存储过程和输入验证



除了 PreparedStatement,还应该使用:



  • 存储过程——通过 CallableStatement 调用过程也能将代码与数据分离。
  • 白名单——如果需要插入表名或列名(这种情况很少见),永远不要从用户输入中获取。请使用枚举或严格定义的常量。
  • 输入验证——检查电子邮件是否确实像电子邮件,数字是否确实是数字。但请记住:验证是额外的一层,不能替代 PreparedStatement。


安全处理动态表名的示例:



public enum TableName {    USERS, PRODUCTS, ORDERS}

public void queryTable(TableName table) { String que

博客

书籍推荐