类型: 安全缺陷

    SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语句的含义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。

    例如:下面代码片段中,动态构造并执行了一个SQL查询来认证用户。

    1. public void doPrivilegedAction(HttpServletRequest request, char[] password) throws SQLException {
    2. Connection connection = getConnection();
    3. if (connection == null) {
    4. // handle error
    5. }
    6. try {
    7. String username = request.getParameter("username");
    8. String pwd = hashPassword(password);
    9. String sqlString = "SELECT * FROM db_user WHERE username = '" + username + "' AND password = '" + pwd + "'";
    10. Statement stmt = connection.createStatement();
    11. ResultSet rs = stmt.executeQuery(sqlString);
    12. if (!rs.next()) {
    13. throw new SecurityException( "User name or password incorrect");
    14. }
    15. // Authenticated; proceed
    16. } finally {
    17. try {
    18. connection.close();
    19. } catch (SQLException x) {
    20. // forward to handler
    21. }
    22. }
    23. }

    在上面的例子中,攻击者能够自由控制输入的字符串变量username和password中的内容,他们可以使用下面的关于username的字符串进行SQL注入。
    validuser’ OR ‘1’=’1
    当其注入到命令时,命令就会变成:
    SELECT FROM db_user WHERE username=’validuser’ OR ‘1’=’1’ AND password=’’
    同样,攻击者可以为password提供如下字符串。
    ‘ OR ‘1’=’1
    当其注入到命令时,命令就会变成:
    SELECT
    FROM db_user WHERE username=’’ AND password=’’ OR ‘1’=’1’