パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「ドラゴンボールZ」のスマホゲームで「ガチャ」でプレイヤーごとに提供割合が違う疑いが出る」記事へのコメント

  • 公式の説明で公開されたソースコード [bngames.net] は、サーバ側ではなくユーザーがダウンロードするアプリに含まれていたコードなので、アプリを逆コンパイルをすることで実際に使われていたコードであることを確認することができます。ただし、利用規約違反となる恐れがあります。

    当該のコードは、実際にユーザーに配信されたアプリに含まれていた [imgur.com] ようなので、公表さ

    • まじかよ
      ユーザーローカルで実行されるコードでSQLのWHERE節を%sで組み立てちゃうのかよ
      典型的なSQLインクジェットの原因になるんじゃないの
      親コメント
      • ユーザーローカルで実行されるコードでSQLのWHERE節を%sで組み立てちゃうのかよ
        典型的なSQLインクジェットの原因になるんじゃないの

        当該コードについては、ソシャゲ事業者のサーバ上のデータベースではなく、ユーザーの端末のストレージ上に存在する SQLite データベースに接続して cache.cards テーブルからデータを取得しているだけなので、特に問題無いと思います。

        親コメント
      • by Anonymous Coward

        内部で指定されたIDしか入らないと分かっているなら心配ご無用です。

      • by Anonymous Coward

        今回はクライアントサイドのコードですし、仮にサーバーサイドでも元のデータがuint32_tのvectorなので、どう頑張っても"SQLインジェクション"はできません。(継承してたら可能性はゼロではありませんが、現実的ではない)
        Web業界は馬鹿の一つ覚えでSQLは全部プリペアードステートメントって風潮がありますが、ゲーム業界だとパフォーマンス重視でこう言う安全が保障されているところでは、自前で組み立てたりします。
        他にRDBMSであえてリレーションを貼らずにソフト側で処理したりとか、独自の最適化?が結構あります。
        こう言った最適化の積み重ねがの結果がモッサリ感有無になったりするので、結構重要です。

        • 引数が整数なのでインジェクションの心配がない、という点については同意なんですが

          必要最小限(キャッシュにないデータ)だけを取ってくるのではなく、キャッシュから取得済のIdも含めた全Idを IN に入れたSQLを発行するなんて、とても「パフォーマンス重視」とは思えないですね。パフォーマンスを気にするなら、キャッシュになかったIdだけを指定して取得するSQLを発行しないと。

          単に「引数個数不定だからプリペーアドステートメントが使えないのでSQL文字列生成した」だけで「パフォーマンスのことなんか何も考えてないだけ」に一票入れたい。

          親コメント
      • by Anonymous Coward

        なら数不定のwhere inをどうやって事前に組み立てるのか教えて欲しい。
        in文については、プリペアードステートメントで指定出来る方法を一向に提供しないDB側にも大いに問題あるよ

        • by Anonymous Coward

          良く見るのは↓見たいな形を関数化してたりしますね。
          PHPです。(必要な箇所以外端折っています)
            $db->prepare('SELECT ~ WHERE id IN (' . str_repeat('?,', count($ids) - 1) . '?)')->execute($ids);
          str_repeatは第一引数を第二引数回繰り返しした文字列を返します。
          $id以外にある場合は少し面倒ですが、一度関数化してしまえば、それほど不満なく使えますよ。

にわかな奴ほど語りたがる -- あるハッカー

処理中...