2012-06-26 1 views
3

Например, что делает «" вокруг #Trim (FORM.fromfirstname) # do? Я добавляю <cfqueryparam...> теги, и мне интересно, нужны ли котировки?В ColdFusion, что делают одиночные и двойные кавычки вокруг значений атрибутов?

<CFQUERY NAME="account" DATASOURCE="#APPLICATION.centralDSN#"> 
    SELECT * 
    FROM users 
    WHERE (firstname =<CFQUERYPARAM VALUE="#Trim(FORM.fromfirstname)#">) 
     AND (lastname = <CFQUERYPARAM VALUE="#Trim(FORM.fromlastname)#">) 
     AND (email = '#Trim(FORM.fromemail)#') 
</CFQUERY> 

Вот один, который не использует кавычки для пункта WHERE:

<CFIF getUser.RecordCount> 
    <CFQUERY NAME="cUser" DATASOURCE="#APPLICATION.centralDSN#"> 
     UPDATE users 
      SET mailing_list = <CFIF IsDefined("FORM.mailing_list")>#FORM.mailing_list#<CFELSE>0</CFIF> 
     WHERE user_id = #getUser.user_id# 
    </CFQUERY> 
</cfif> 

EDIT: если они ничего не делают, нет никакого вреда в соответствии их, правильно? В другом файле я нашел примеры, такие как

to="#ListFirst(EnglishEmailList)#" 
    cc="#ListRest(EnglishEmailList)#" 

Итак, если они уже есть, я оставлю их?

ответ

10

SQL нуждается в котировках для строк.

Цитаты являются частью стандартного синтаксиса SQL, чтобы указать строку (как и на самом деле почти на каждом языке).

Если у него не было котировок, тогда синтаксический анализатор SQL не имел бы представления о том, где закончилась строка, и SQL продолжался.

Цитаты не нужны для чисел - там, где нет двусмысленности относительно того, где заканчивается значение.

Помните, что # хэши # не имеют никакого отношения к SQL - они полностью связаны с CFML-стороной. При запуске тега cfquery CF оценивает тело (включая любые содержащиеся в нем хэш-выражения) для создания строки SQL, которая затем передается в базу данных (наряду с дополнительными настройками/параметрами и т. Д.). Сервер SQL не знает, какие части этой строки были жестко закодированы и какие части могли быть оценены из хешей.


cfqueryparam не нуждается в котировках.

Когда вы исправляете запросы на использование cfqueryparam, вы создаете параметры, и тег обрабатывает все необходимое, чтобы указать строки/etc в базу данных SQL. (Вам не нужно обернуть сам cfqueryparam тег в кавычках.)

В cfqueryparam тега, он делает нулевую разницу или нет использовать вы кавычки для атрибутов - эти три все тот же результат:

<cfqueryparam value="#var#" /> 
<cfqueryparam value='#var#' /> 
<cfqueryparam value=#var# /> 
5

Если вы используете <cfqueryparam>, вам никогда не придется использовать кавычки.

Если вы сравниваете строку в SQL (и не используете <cfqueryparam>), тогда вам нужно использовать кавычки. Если вы сравниваете число (и не используете <cfqueryparam>), вам не нужны кавычки.

3

Кавычки по-прежнему необходимы для строк, если вы не используете тег queryparam, и вы должны использовать queryparams для любых переменных в запросах всякий раз, когда это возможно.

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

2

Я знаю, что это утомительно, но если вы очистите свои переменные, прежде чем вставлять их в SQL-инструкцию, их легче понять и прочитать.

Вот как бы я это пишу:

// manipulate and rescope variables as required here 
// no quotes or pound signs necessary when when not outputting 
<cfset VARIABLES.FirstName = Trim(FORM.fromfirstname)> 
<cfset VARIABLES.LastName = Trim(FORM.fromlastname)> 
<cfset VARIABLES.Email  = Trim(FORM.fromemail)> 

// stop sql inject ~ use cfqueryparam 
// simplifying your sql statement will make it much easier to diagnose problems 
<CFQUERY NAME="account" DATASOURCE="#APPLICATION.centralDSN#"> 
    SELECT * 
    FROM users 
    WHERE firstname = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.FirstName#"> 
     AND lastname = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.LastName#"> 
     AND email = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.Email#"> 
</CFQUERY> 

В WHERE предложении на следующий SQL Statement, в вы выводя целое, поэтому никакие кавычки не нужны.

WHERE user_id = #getUser.user_id# 

Конечно, было бы легко повредить вашу базу данных. Используйте cfqueryparam и сохранить свою работу ...

WHERE user_id = <CFQUERYPARAM cfqltype='cf_sql_integer' VALUE="#VARIABLES.user_id#"> 

Вместо того, чтобы делать свой IF/ELSE вход внутри SQL заявление, сделать это до того, как это:

<cfif isDefined("FORM.mailing_list")> 
    <cfset VARIABLES.mailing_list = trim(FORM.mailing_list)> 
<cfelse> 
    <cfset VARIABLES.mailing_list = 0> 
</cfif> 

UPDATE users 
SET mailing_list = <cfqueryparam cfsqltype="cf_sql_varchar" value="#VARIABLES.mailing_list#"> 
WHERE user_id = #getUser.user_id# 
+0

о поверьте мне, я не был тот, кто написал этот код, и это боль в заднице, чтобы читать. Файл, над которым я работаю сейчас, существует примерно с 1999 года, и перед ним работает 5 человек. – Celeritas

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