通过添加分隔符来参数化查询

时间:2018-03-05 19:54:57

标签: java oracle jdbc parameters sql-injection

Asumming所有参数都是字符串,我通过这个函数运行所有参数(我禁止在我的网站上使用“|”字符)

public String EscapeParameter(String Param)
{
  return "|" + param.replace("|", "") + "|"  
}

这是一种安全的参数化查询方式。在这一点上我肯定知道所有参数都以“|”开头并以“|”结束那么我可以直接浏览字符串并参数化查询,无论它最初是如何构建的?

public String DynamicParameterizeQuery(String sql)
{
    int stringSize = sql.length();
    StringBuilder paraValueBuilder = new StringBuilder();
    Boolean inParam = false;
    StringBuilder sb = new StringBuilder();
    Map<String, String> paramMap = new HashMap<String, String>();
    for(int i = 0; i < stringSize; i++)
    {
        Character currentChar = sql.charAt(i);
        if(currentChar == '|' && inParam == false)
        {
            inParam = true;
        }
        else if(currentChar == '|' && inParam == true)
        {
            inParam = false;
            paramMap.put(":" + i*1000, paraValueBuilder.toString());
            sb.append(":" + i*1000 + " ");
            paraValueBuilder = new StringBuilder();
        }
        else
        {
            sb.append(currentChar);
        }
    }
    getRows(sql, paramMap);
}


/**
 * Gets a list of objects <T> from the database.
 *
 * @param <T> object type to be returned
 * @param sql query to execute
 * @param objectParameters query parameter values
 * @param targetClass target class that will be returned. <T>
 * @return A list of the specified objects.
 */
public <T> List<T> getRows(String sql, Object objectParameters, Class<T> targetClass) {
    RowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(targetClass);
    return getRows(sql, objectParameters, rowMapper);
}

这是一种防止SQL注入的安全方法吗?

1 个答案:

答案 0 :(得分:0)

我不会使用这种方法。

目前尚不清楚这是打算解决的问题。我想你是专注于你需要将动态值连接到SQL查询中的想法,直到你宁愿这样做,然后编写一个精心设计的Java方法来提取值,以便将它们用作适当的参数。

你选择了“|”作为分隔符,这意味着您的网站必须禁止包含该字符的任何内容。祝你好运向产品经理或用户解释这个限制。

为什么不直接使用查询参数?

  • 众所周知,参数是一种安全可靠的解决方案。
  • 参数最简单,不易出错。
  • 参数不需要新的Java方法来取消连接字符串。
  • 参数对值中可显示的字符没有限制。那么,你的方法将如何处理二进制数据?

使用每个人都知道的标准解决方案是安全的。在代码审核期间,您可以通过而不是至少保存30分钟来解释您的DynamicParameterizeQuery()方法以及为什么它是安全的以及您的网站无法支持的原因“|”字符。

enter image description here