TEXTタイプの商品オプションでSQLエラー

古いバージョンのZen Cartについて不具合が見つかった場合はこちらで情報を共有してください。
アバター
ぺーすけ
記事: 6
登録日時: 2006/8/18 17:01

TEXTタイプの商品オプションでSQLエラー

投稿記事by ぺーすけ » 2006/8/21 13:55

度々お世話になります。ぺーすけです。

名入れ商品などに用いるTEXTタイプの商品オプションですが、
このオプションに「\」を入力して、カートに入れると、SQLのエラーが発生します。

「\」をエスケープしていないためだと思いますが、
どこを修正すればよいのか、ご教授いただけないでしょうか?
アバター
ぺーすけ
記事: 6
登録日時: 2006/8/18 17:01

自己解決報告

投稿記事by ぺーすけ » 2006/8/24 11:14

自己解決しましたのでご報告いたします。
やはり入力をエスケープしないままSQLにしているのが問題のようです。

include/functions/functions_lookups.php 353行目付近
function zen_get_attributes_valid の

コード: 全て選択

$check_attributes = $db->Execute("select attributes_display_only, attributes_required from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id='" . $product_id . "' and options_id='" . $option . "' and options_values_id='" . $value . "'");


コード: 全て選択

$check_attributes = $db->Execute("select attributes_display_only, attributes_required from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id='" . $product_id . "' and options_id='" . $option . "' and options_values_id='" . zen_db_prepare_input( $value ) . "'");

と、$valueをエスケープするようにしたところ、問題は解決しました。

しかしながら、この問題、SQLインジェクションの脆弱性に当てはまると思うのですが、いかがでしょうか。
バージョン: zen-cart-v1.2.0-l10n-jp-6
アバター
aoi
記事: 140
登録日時: 2006/3/04 17:38

Re: 自己解決報告

投稿記事by aoi » 2006/8/24 17:36

ぺーすけ さんが書きました:

コード: 全て選択

$check_attributes = $db->Execute("select attributes_display_only, attributes_required from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id='" . $product_id . "' and options_id='" . $option . "' and options_values_id='" . zen_db_prepare_input( $value ) . "'");

と、$valueをエスケープするようにしたところ、問題は解決しました。

zen_db_prepare_input()はエスケープする関数ではなくエスケープを外す関数だったと思います。エスケープする場合はzen_db_input()ですね。ややこしいですけど。

個人的には

コード: 全て選択

$check_attributes = $db->Execute("select attributes_display_only, attributes_required from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id='" . (int)$product_id . "' and options_id='" . (int)$option . "' and options_values_id='" . (int)$value  . "'");
とすればいいのではないかと思います。他の箇所もidは全部(int)を付けるのが安全だと思います.
$product_idは$_POST['products_id']そのままだったりしますし。

ぺーすけ さんが書きました:しかしながら、この問題、SQLインジェクションの脆弱性に当てはまると思うのですが、いかがでしょうか。
私もそう思います。
アバター
ぺーすけ
記事: 6
登録日時: 2006/8/18 17:01

Re: 自己解決報告

投稿記事by ぺーすけ » 2006/8/24 18:19

aoi様。早速の返信、ありがとうございます。

aoi さんが書きました:zen_db_prepare_input()はエスケープする関数ではなくエスケープを外す関数だったと思います。エスケープする場合はzen_db_input()ですね。ややこしいですけど。

:shock: ありゃりゃ。おっしゃる通りでした。
「\」をエスケープしていたのではなくて、外したからSQLが通ったんですね :oops:
不勉強でした。間違いのないようにしなければ。

aoi さんが書きました:個人的には

コード: 全て選択

$check_attributes = $db->Execute("select attributes_display_only, attributes_required from " . TABLE_PRODUCTS_ATTRIBUTES . " where products_id='" . (int)$product_id . "' and options_id='" . (int)$option . "' and options_values_id='" . (int)$value  . "'");
とすればいいのではないかと思います。

これもまた、おっしゃるとおりです。上記の修正で問題ありませんでした。
文字列として$valueを検索する必要はないので、(int)でOKでした。

aoi さんが書きました:他の箇所もidは全部(int)を付けるのが安全だと思います.
$product_idは$_POST['products_id']そのままだったりしますし。

zen-cart-v1.2.0-l10n-6であっても、SQLインジェクションの脆弱性への対応はすべて修正されているわけではないのですね。
該当する箇所を見つけたら、一つひとつ潰していくほかないのか……。

ともかく、ありがとうございました。これですっきりしました。
バージョン: zen-cart-v1.2.0-l10n-jp-6

“1.3.0.x公式版の不具合情報” へ戻る