造成SQL注入攻击的根本原因在于攻击者可以改变SQL查询的上下文,使程序员原本要作为数据解析的数值,被篡改为命令了。防止SQL注入的方法如下:

    正确使用参数化API进行SQL查询。
    如果构造SQL指令时需要动态加入约束条件,可以通过创建一份合法字符串列表,使其对应于可能要加入到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=:password";
    7. Query createQuery = em.createQuery(sqlString);
    8. createQuery.setParameter("username", username);
    9. createQuery.setParameter("password", pwd);
    10. //...
    11. Object singleResult = createQuery.getSingleResult();
    12. if(object == null){
    13. //...
    14. }
    15. //...
    16. }