4

たとえば、#Trim(FORM.fromfirstname)# の周りの "" は何をするのでしょうか? タグを追加<cfqueryparam...>していますが、引用符がまだ必要かどうか疑問に思っていますか?

<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>

編集: 彼らが何もしなければ、それらを保持しても害はありませんよね? 別のファイルで、次のような例を見つけました

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

それで、彼らがすでにそこにいるなら、私はそれらを残しますか?

4

4 に答える 4

11

SQL では文字列に引用符が必要です。

引用符は、文字列を示すための標準 SQL 構文の一部です (実際、ほとんどすべての言語に存在します)。

引用符がない場合、SQL パーサーは文字列がどこで終了し、SQL が続くかを認識できません。

数値には引用符は必要ありません - 値がどこで終わるかについてあいまいさがありません。

#hash# は SQL とは関係がないことも覚えておいてください。これらは完全に CFML 側にあります。cfquery タグを実行すると、CF は本文 (そこに含まれるすべてのハッシュ式を含む) を評価して SQL 文字列を作成し、それをデータベースに (追加の設定/パラメータ/その他と共に) 渡します。SQL サーバーは、その文字列のどの部分がハードコードされたか、またどの部分がハッシュから評価された可能性があるかを認識していません。


cfqueryparam には引用符は必要ありません。

cfqueryparam を使用するようにクエリを修正する場合は、パラメーターを作成します。タグは、文字列などを SQL データベースに示すために必要なすべてを処理します。(cfqueryparam タグ自体を引用符で囲む必要はありません)。

cfqueryparam タグ内では、属性に引用符を使用するかどうかに関係なく、これら 3 つのすべてで同じ結果が得られます。

<cfqueryparam value="#var#" />
<cfqueryparam value='#var#' />
<cfqueryparam value=#var# />
于 2012-06-26T23:47:53.447 に答える
5

を使用している場合<cfqueryparam>は、引用符を使用する必要はありません。

SQL で文字列を比較している (そして を使用していない<cfqueryparam>) 場合は、引用符を使用する必要があります。数値と比較している (そして を使用し<cfqueryparam>ていない) 場合は、引用符は必要ありません。

于 2012-06-26T23:10:14.707 に答える
3

queryparamタグを使用していない場合でも、文字列には引用符が必要です。可能な場合は常に、クエリ内の変数にqueryparamsを使用する必要があります。

この機能を使用しないと、SQLインジェクションの攻撃ポイントが作成される可能性があり、悪用される可能性があります。

于 2012-06-26T23:19:43.547 に答える
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>

次の SQL ステートメントのWHERE句では、整数を出力しているため、引用符は必要ありません。

    WHERE user_id = #getUser.user_id#

もちろん、データベースを台無しにするのは簡単です。cfqueryparam を使用してジョブを保存します...

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

SQL ステートメント内で IF/ELSE ログインを行う代わりに、次のように前に行います。

<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#
于 2012-06-26T23:53:21.900 に答える