формировать данные в базу данных: предотвращение внедрения SQL - PullRequest
3 голосов
/ 08 января 2012

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

Вот код, который вставляетданные формы в БД:

        <cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc">

            INSERT INTO Schedule_Registrations(
                schedule_id,
                first_name,
                last_name,
                phone_number,
                email,
                guest,
                list_type,
                datetime_registered
             )
            VALUES(
                #url.schedule_id#,
                '#FORM.first_name#',
                '#FORM.last_name#',
                '#CleanPhoneNumber#',
                '#FORM.email#',
                 #attendee.guest#,
                 <!--- Values for list types 
                    0 = NEVER USE Will cause many many problems
                    1 = Main List
                    2 = Waiting List --->                    
                 #attendee.list_type#,
                 #createodbcdatetime(now())#
             )                
        </cfquery>

CleanPhoneNumber устанавливается следующим образом:

<cfset CleanPhoneNumber = REReplace(form.phone_number, "[^0-9]", "", "ALL") />

Мне сказали использовать, например,

<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.phone_number#" />

но я не уверен, что заменить и где.Когда я заменяю значения такими, я получаю сообщение об ошибке.

Любое направление будет полезным.

Ответы [ 2 ]

5 голосов
/ 08 января 2012

Вы должны обернуть все переменные формы и URL в cfqueryparam

Ваш запрос будет выглядеть следующим образом:

<cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc">
    INSERT INTO Schedule_Registrations(
         schedule_id,
         first_name,
         last_name,
         phone_number,
         email,
         guest,
         list_type,
         datetime_registered
     )
     VALUES(
         <cfqueryparam cfsqltype="cf_sql_integer" value="#url.schedule_id#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.first_name#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.last_name#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#CleanPhoneNumber#">,
         <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.email#">,
         <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.guest#">,
         <!--- Values for list types 
            0 = NEVER USE Will cause many many problems
            1 = Main List
            2 = Waiting List --->                    
         <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.list_type#">,
         #createodbcdatetime(now())#
     )                
</cfquery>

Я не уверен, что все типы данных были правильными,см. полную документацию cfqueryparam для всех типов данных.

0 голосов
/ 08 января 2012

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

Для кода вставки, который вы предоставили, вы можете явно проверить ввод полей формы перед вставкой данных. Проверьте наличие таких элементов, как пробелы и "'".Вы также хотите убедиться, что пользователь не видит ваши сообщения об ошибках из-за введенных неверных данных.Это полезно для тех, кто хочет знать структуру вашей таблицы.

В противном случае поместите вставку в хранимую процедуру и проверьте входные параметры перед вызовом хранимой процедуры для вставки или обновления.

Вотхороший список того, что вы можете сделать, чтобы предотвратить атаки с использованием SQL-инъекций.Он связан с asp.net, но концепции все еще применяются независимо от того, какой язык вы используете.

Как: защитить от атак с использованием инъекций в ASP.NET

...