2017-03-10 7 views
0

で空dataWrapハンドル私はtx_extension_domain_model_itemレコードで参照されたときtt_contentレコードをレンダリング生成する必要があり、次のTypoScriptスニペット、「継承」しました:のTypoScript

lib.recordBasedHighlight = CONTENT 
lib.recordBasedHighlight { 
    table = tt_content 
    select.orderBy = sorting 
    select.languageField = sys_language_uid 

    select.andWhere.stdWrap.cObject = TEXT 
    select.andWhere.stdWrap.cObject { 
     dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:referenced_content 
     wrap3 = uid IN ({|}) 
     insertData = 1 
    } 
    select.pidInList.stdWrap.cObject = TEXT 
    select.pidInList.stdWrap.cObject { 
     dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:pid 
     wrap3 = {|} 
     insertData = 1 
    } 

    renderObj < tt_content 
    renderObj.list.10 > 
} 

referenced_contentフィールドは、いくつかの実際のコンテンツを持っているとき、これが正常に動作します(値はtt_contentのuidになります)。これが当てはまらない場合、wrap3ステートメントの結果はuid IN()になります。これは予期したとおり、SQLエラーをスローします。

私はコンテンツが参照されていない場合、そのフィールドが空である場合andWhere句が空になるように、pidInListにPIDからフェッチされている全てのコンテンツをもたらす.select.andWhere.stdWrap.cObject構成にrequired = 1を追加しようとしました。

referenced_contentが空の場合、正しいtt_contentレコードがレンダリングされ、レコードがレンダリングされないように、上記のスクリプトスニペットをどのように変更する必要がありますか?

+0

SQLインジェクションを防ぐには、 'intval = 1'を使用してください! –

+0

良い点ですが、どこに置くべきかわかりませんが、適用できる唯一の変数は 'GP:tx_extension_pi1 | item'です。そして、整数への明示的なキャストはありませんが、このtyposcriptが実装される唯一の方法は、有効なUIDがGETパラメータに渡されるときです(コントローラアクションプロパティを使用して)。私はスクリプトに他の情報を渡そうとしましたが、いくつかのランダムな内容のGETパラメータを持つURLをいくつか要求し、何が起きているかを調べるためにxdebugのブレークポイントを追加しましたが、何もデータベースに渡されませんでした。 – Plenka

+0

GET/POSTパラメータが整数にキャストされていることを確認するためにintvalをどこに置くべきかを指定できますか?私はそれを追加することを傷つけることはありません。 :) – Plenka

答えて

0

ifEmptyで何かをするのは明らかでしたが、私は正しいことができませんでした。私が物事を根本的に変えようとするまでは。私にとっては、次の作品:referenced_contentフィールドが空の場合

lib.recordBasedHighlight = CONTENT 
lib.recordBasedHighlight { 
    table = tt_content 
    select.orderBy = sorting 
    select.languageField = sys_language_uid 

    select.andWhere.stdWrap.cObject = TEXT 
    select.andWhere.stdWrap.cObject { 
     stdWrap { 
      cObject = TEXT 
      cObject { 
       # NOT SAFE: GET/POST parameter is passed on to the database without sanitation 
       dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:referenced_content 
       wrap3 = {|} 
       insertData = 1 
      } 
      ifEmpty.cObject = TEXT 
      ifEmpty.cObject.value = 0 
     } 
     wrap = uid IN (|) 
    } 
    select.pidInList.stdWrap.cObject = TEXT 
    select.pidInList.stdWrap.cObject { 
     # NOT SAFE: GET/POST parameter is passed on to the database without sanitation 
     dataWrap = DB:tx_extension_domain_model_item:{GP:tx_extension_pi1|item}:pid 
     wrap3 = {|} 
     insertData = 1 
    } 

    renderObj < tt_content 
    renderObj.list.10 > 
} 

この結果andWhereではuid IN (0)です。その結果、tt_contentのレコードがレンダリングされなくなりました。

このスニペットは結果が返されないことがあらかじめわかっているSQLクエリになりますが、代わりにより良いtyposcript(自分のものではない)を書き込むか、 userFunc。いずれにしても、それはより多くの作業になりますし、TYPO3ではかなりのリソースを必要とするため、単一のクエリではそれ以上の害はありません。だから私は解決策に満足しています。

EDIT

Thomas Löfflerは当然、元の質問の最初のコメントで指摘したように、コードスニペットに大きなセキュリティ上の漏れがある:使用GETパラメータは、データベースに渡される前にサニタイズされていません。私はコードスニペットが使用されているプロジェクトではこれはあまり関係ありませんが、提案されたセキュリティ対策を組み込むためにスニペットを書き直す時間はかかりませんでした(より詳細な説明については私のコメントを参照してください)。これはコードスニペットがすべての状況で安全であることを意味するものではありません。この答えに警告が含まれます:コードスニペットは本質的に安全ではありません!あなた自身の裁量でこのスニペットを使用してください!

関連する問題