ColdFusion sql выпуск - PullRequest
       9

ColdFusion sql выпуск

0 голосов
/ 06 сентября 2018

Запустил проверку безопасности по URL и получил отчет ниже:

Уязвимость затрагивает

 /rolecall.cfm , bbb_id

Это код rolecall.cfm:

<cfscript>
if (isDefined("url") and isDefined("url.bbb_id")) {
    if (url.dept_id eq -1)
        _include("sql", "getB");
    else
        _include("sql", "getBNow");
}

/*...*/
_include("sql", "getDPlaces");

/*Set up the model and go*/
model = {
    add    = 1,
    edit   = 0,
    remove = 0,
    places   = getDPlaces
};
</cfscript>

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Если вы используете IIS, вам следует прочитать эту статью , чтобы узнать, как добавить защиту от SQL-инъекций непосредственно на веб-сервер. Это предотвратит попадание запросов на атаку в ColdFusion.

Будьте осторожны со строками, которые они предлагают отрицать:

<denyStrings> 
   <add string="--" /> 
   <add string=";" /> 
   <add string="/*" /> 
   <add string="@" /> 

Убедитесь, что вы никогда не передаете адрес электронной почты в качестве значения параметра строки запроса, в противном случае вы отклоните законный запрос. Вы можете разрешить символ @ при необходимости.

Я также настоятельно рекомендую вам взглянуть на HackMyCF , который покажет вам множество других проблем безопасности, если они существуют.

0 голосов
/ 06 сентября 2018

SQL-инъекция использует базы данных, вставляя вредоносные команды sql в запрос, где они не ожидаются. Обманывая запрос, нужно сделать что-то отличное от того, для чего он был предназначен, например выполнить DROP или DELETE вместо SELECT.

  1. Запросы, использующие необработанные параметры клиента, подобные этим, уязвимы:

    WHERE policy_funct_id = #url.dept_id#
    

    Вместо этого всегда переносите клиентские параметры в cfqueryparam . Это предотвращает их выполнение в качестве команды. Я не знаю типы данных вашего столбца, поэтому при необходимости измените тип cfsql.

    WHERE policy_funct_id = <cfqueryparam value="#url.dept_id#" cfsqltype="cf_sql_integer">
    
  2. Все имена динамических таблиц являются еще одной (потенциальной) уязвимостью, например:

    -- potential sql-injection risk
    SELECT * FROM #db.root#
    

    Если #db.root# предоставлен пользователем, это риск для sql-i. К сожалению, cfqueryparam нельзя использовать для имен таблиц . Они должны быть проверены вручную (и тщательно).


Несколько других предложений, не связанных с внедрением sql:

  • Все вложенные операторы (select * from...) снижают читабельность. Вместо этого используйте один уровень JOIN.

  • При использовании JOIN лучше всего указывать исходную таблицу (или псевдоним таблицы) для всех столбцов. Это позволяет избежать двусмысленности и повышает читабельность для себя и всех, кто просматривает код. Не нужно угадывать, какие столбцы и из какой таблицы взяты.

* 1 042 * Пример
-- psuedo example
 SELECT  root.ColumnA
    , root.ColumnB
    , dept.ColumnC
    , subcat.ColumnC
    , etc... 
 FROM #db.root# root 
       INNER JOIN #db.content# content ON root.policy_root_id = content.content_id
       INNER JOIN #db.dept# AS dept ON ON content.dept_id = dept.policy_funct_id
       INNER JOIN #db.subcat# subcat ON subcat.dept_id = dept.policy_funct_id
 WHERE dept.policy_funct_id = <cfqueryparam value="#url.dept_id#" cfsqltype="cf_sql_integer">
 AND   content.is_newest = 1
...