类型: 安全缺陷

    SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语句的含义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。使用Persistence执行由用户输入构建的动态SQL指令,会让攻击者有机会篡改指令的含义或者执行任意的SQL命令。

    1. public void doPrivilegedAction(HttpServletRequest request, char[] password) throws SQLException {
    2. String username = request.getParameter("name");
    3. EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPA");
    4. EntityManager em = emf.createEntityManager();
    5. String pwd = hashPassword(password);
    6. String sqlString = "SELECT * FROM db_user WHERE username = '" + username + "' AND password = '" + pwd + "'";
    7. Query createQuery = em.createQuery(sqlString);
    8. //...
    9. Object singleResult = createQuery.getSingleResult();
    10. if(object == null){
    11. //...
    12. }
    13. //...
    14. }

    如果攻击者能够替代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’