2013-09-13 5 views
0

У меня есть форма ниже, и я хотел бы дать оповещение пользователя, если какая-либо из приведенных ниже записей неверна. Где можно добавить мое исключение ниже кода?Как проверить правильность ввода имени пользователя и имени базы данных?

enter image description here

MYcode:

public static void GetTables(Members src) 
    { 

     OracleConnection conn1 = MyConnectionClass.GetConnection(src.DB, src.ID, src.Password); 

     conn1.Open(); 
     using (OracleCommand command= new OracleCommand("SELECT * FORM DBA_USERS WHERE USER NAME=" + src.ID + " and PASSWORD=" + src.Password + "", conn1)) 
     { 
      using (OracleDataReader reader = command.ExecuteReader()) 
      { 
       int count = 0; 
       while (reader.Read()) 
       { 
        count = count + 1; 
       } 
      } 
     } 
    } 
+14

[Little Bobby Tables] (http://xkcd.com/327/) собирается нанести вред вашему приложению. Рассмотрите возможность использования параметризованных запросов для защиты от таких пользователей. – Servy

+2

Я, конечно, надеюсь, что 'src.Password' содержит хешированный пароль, а не пароль в виде обычного текста. –

+0

Хорошо, что мешает вам достичь своей цели? –

ответ

1

Я просто посмотрел на код еще раз, и это полное бедствие. Итак, вы говорите мне, что соединение, установленное приложением, имеет доступ к таблице DBA_Users? Это красный флаг большого размера.

Вы должны:

  • создать схему, которая будет ваша схема приложения

  • использование PWD и имя пользователя для этой схемы в строке соединения, которые он зашифрован, недостижимый пользователем

  • в вашем приложении есть таблица, которая называется не только «пользователями», но и что-то вроде «users1f0tm34m».

  • используйте эту таблицу, чтобы подтвердить свое приложение входящим пользователем.

В принципе, вы установили соединение, используя свои приложения, зашифрованную строку conn. Здесь вы проверяете правильность соединения. Вторая проверка будет против вашей таблицы, если учетные данные пользователя верны.

Теперь, вы должны прекратить спор об этом:

SELECT * FORM DBA_USERS WHERE USER NAME=" + src.ID + " and PASSWORD=" + src.Password + "" 

Кроме SQL инъекций есть оптимизация. Этот код, приведенный выше, заставит оптимизатора оракула создать план для запроса каждый раз, когда будет запущен следующий пользователь. Чтобы избежать этого, вам нужно использовать переменные связывания с помощью параметров:

SELECT * FORM DBA_USERS WHERE USER NAME=:uname and PASSWORD=:pwd 

Это Oracle рекомендуется так и то, что вы сделали это динамический SQL, который является Oracle, не рекомендуется.

Если у вашей компании есть аудит, вы приготовлены.

Смежные вопросы