Предотвращение внедрения SQL из сгенерированного формой SQL - НЕТ PreparedStmts - PullRequest
4 голосов
/ 18 мая 2010

У меня есть таблица поиска, где пользователь сможет фильтровать результаты с помощью фильтра типа:

  • Поле [Имя], Значение [Джон], Удалить Правило
  • Поле [Фамилия], Значение [Блейк], Удалить правило
  • Поле [Имеет детей], Значение [Да], Удалить правило
  • Добавить правило

Таким образом, пользователь сможет установить произвольный набор фильтров, что в результате приведет к созданию полностью динамического предложения WHERE. В будущем мне также придется реализовать более сложные логические выражения, такие как

Где (имя = Джон ИЛИ имя = Ник) И (фамилия = Блейк ИЛИ фамилия = Борн),

Из всех 10 полей, по которым пользователь может фильтровать или не фильтровать, я не знаю, сколько и какие фильтры он будет устанавливать. Поэтому я не могу использовать подготовленный оператор (который предполагает, что, по крайней мере, мы знаем поля в предложении WHERE). Вот почему подготовленные операторы, к сожалению, не обсуждаются, я должен делать это с простым старым, сгенерированным SQL.

Какие меры я могу предпринять для защиты приложения от SQL-инъекций (с помощью REGEX или любым другим способом)?

Ответы [ 3 ]

5 голосов
/ 18 мая 2010

Java, не проверено.

List<String> clauses = new ArrayList<String>();
List<String> binds = new ArrayList<String>();

if (request.name != null) {
    binds.add(request.name);
    clauses.add("NAME = ?");
}

if (request.city != null) {
    binds.add(request.city);
    clauses.add("CITY = ?");
}

...

String whereClause = "";

for(String clause : clauses) {
    if (whereClause.length() > 0) {
        whereClause = whereClause + " AND ";
    }
    whereClause = whereClause + clause;
}

String sql = "SELECT * FROM table WHERE " + whereClause;

PreparedStatement ps = con.prepareStatment(sql);

int col = 1;
for(String bind : binds) {
    ps.setString(col++, bind);
}

ResultSet rs = ps.executeQuery();
2 голосов
/ 18 мая 2010

SQL Server: динамическое предложение where

Динамически создает предложение where, но делает это с использованием имен параметров.

2 голосов
/ 18 мая 2010

Если вы добавите аргументы в подготовленные операторы, они будут автоматически экранированы.

conn = pool.getConnection( );
String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...