はじめまして、サービスとして動作させるプログラムを作成しています。
プログラムの中で、DBにアクセスする為、プログラム中にSQLを
記述しているのですが、SQLの長さが1024バイト以上ある場合、
途中で切れてしまうのです。
具体的には、4096バイトのchar型の配列にSQLを下記のようにセット
します。
char temp[4096] ;
strcpy_s(temp, sizeof(temp), "select .........") ;
strcat_s(temp, sizeof(temp), " from ....") ;
strcat_s(temp, sizeof(temp), " where ....") ;
このようにしているのですが、1024バイトを境に、strcat_sで文字列が
tempに足しこまれないという状況です。
たとえば、上の「where」の「h」の部分が1024バイト目だった場合、
tempには、「wh」までは、セットされますが、それ以降がセットされませ
ん。
デバッガでは、配列自体は、4096バイト確保されているようなのですが
1024バイト目以降に、文字列がセットされないのは、何か設定など
があるのでしょうか?
charの配列を使用せず、CStringクラスを使用しても、1024バイトまでは
文字列を足しこむことができますが、1024バイト目以降が無視されて
しまい、困っています。
何か、お分かりの片いたら、教えてもらえませんか?
char [4096] に対して 1024 バイト以後に文字がセットされない、なんてことは
絶対無いので、少なくとも 提示 temp に関しては、セットされる。
# ウチで試した範囲では問題ない
temp から SQL ドライバに渡す際に欠落しているのだと思うが?
ただ、文字の単純結合で SQL 文を生成するのは SQL インジェクションの元なので
セキュリティ的に問題ないか要精査。実際のところ再考慮したほうがいい。
# strcat で結合するくらいなら sprintf/snprintf のほうがいいと思うが?
何で確認していますか?
TRACEマクロ?
TRACEマクロなら内部でOutputDebugStringを使うときにある程度の文字数で切れます。
tetrapodさん、Blueさん、ありがとうございました。
tetrapodさん、使用するSQLが長いため、固定部分はstrcatで
連結しているのですが、長い文字列の生成は、どのようにしていますか?
Blueさん、TRACEは、途中で切られてしまうのは、調べている段階で
判明していました。
色々調べていたところ、ログを採取しているのですが、このログを採取
する時に、「wsprintf」を使用していました。
「wsprintf」を使用してしまうと、1024バイトで切れてしまうことが
わかりました。
これを、「sprintf_s」に変えてやると、切れることなく動作する様に
なりました。
> 長い文字列の生成
俺としては SQL 文を「長い文字列」として生成することはありえない。
だから「長い文字列」をどう作るか、などどうでも良くて、
正しい SQL 文= SQL インジェクション脆弱性の無い SQL 文を作ることと考えるべき。
それ以上のことは今の情報量からだと言えないな・・・
snprintf(buf, BUFSIZE, "SELECT %s FROM %s WHERE PWD='%s' ID='%s'" ...);
とすれば strcat なしに [長い文字列] としての SQL 文は作れる。
が、これは SQL インジェクション脆弱性をもろに含んでいるので0点。
俺なら根幹設計から全部やりなおしさせるレベル。
そういえばodbcの場合ですけど、長いsql分は駄目だった様な・・・
ごめんなさい人世代前の話かも、確信もないのすけど。
そんな話をしていたのを思い出しまして。
一世代前でした、訂正します。
ツイート | ![]() |