2016-03-07 1 views
1

Я хочу проверить мою строку ввода для потенциального SQL-инъекции.check input for SQL-Injection with Mybatis

Вот мой класс, метод и запрос:

public class UserNamesQuery { 

    public static String getUserNames(Map<String, Object> params) { 
     String userNames = (String) params.get("userNames"); 
     return "SELECT * FROM users WHERE name IN (" + userNames + ") "; 
    } 

} 

Есть инструмент или быстрый способ проверить, что userNames без SQL-инъекций?

Обратите внимание, что я использую Mybatis

+3

Вы, вероятно, хотите использовать 'PreparedStatement' вместо того чтобы изобретать колесо. – Mena

+2

Подготовленные утверждения - хороший совет, но это в списке значений IN. [PreparedStatement со списком параметров в предложении IN] (http://stackoverflow.com/questions/3107044/preparedstatement-with-list-of-parameters-in-a-in-clause) –

+0

@AlexK. правильно - у меня проблема с IN – Igor

ответ

7

No. Там нет никакого способа. И не нужно.

Чтобы быть откровенным, нет такой вещи, как «SQL-инъекция». Существует только эксплойт неверно отформатированного запроса.

Итак, вместо того, чтобы охотиться за любыми «инъекциями», вы должны правильно отформатировать свои запросы, используя подготовленные операторы.

Любые данные, зависящие от контекста, могут быть либо потенциальной инъекцией, либо безвредным фрагментом текста. Таким образом, с любой функцией фильтрации будет слишком много ложных срабатываний. Хуже того, какая бы фильтрация не была реализована «черным списком», означает, что всегда будет неполным - просто невозможно отфильтровать все коды, используемые для использования инъекции.

С другой стороны, подготовленная заявка является относительно простым решением, которое будет невосприимчивым к любому типу инъекций, даже не зная их. Просто потому, что он не позволит данным вмешиваться в запрос.

+0

Как бы вы намеревались преодолеть IN в моем запросе и как я могу применить его к mybatis? – Igor

+1

Вам не дали ссылку? –

+0

И никаких проблем с MyBatis нет, так как вы можете указать параметры как # {parameterName}, которые будут автоматически переведены в подготовленный оператор. Для вашего предложения IN вы обычно используете оператор foreach в сопоставлении MyBatis. –

0

Санитарный вход не является способом предотвращения инъекций, подобных этому. Использование подготовленных заявлений - путь.

PreparedStatement ps = connection.prepareStatement("SELECT * FROM users WHERE username IN (?)"); //Add however many ?'s you want, if you have an array you can use a StringBuilder for this to add more ?'s 
ps.setString(1, userName); 
ResultSet rs = ps.executeQuery(); 

Это установит? в коде для вашей строки. Затем драйвер базы данных обрабатывает остальные. Если у вас несколько значений в предложении IN, используйте StringBuilder и цикл, чтобы добавить дополнительные значки.

заметить также, как индексация начинается с 1 вместо 0.