- ベストアンサー
WordPressのSQL取得エラーとテーブル操作の対策まとめ
- WordPressの質問で、var_dump($row);で確認したところ登録結果画面と質問表示画面でNULLが表示され、SQLのSELECT文が失敗している原因を考察しています。
- データベースにURLが格納されているにも関わらず、取得に失敗する例を検討し、IPアドレスの保存およびメッセージの一部を取得するコードの作成や<a>タグを適用する方法について質問しています。
- 提供されたコードの解析と、画像や動画ファイルの表示、メッセージの一部を表示する方法について、具体的なサンプルコードを元に議論しています。
- みんなの回答 (29)
- 専門家の回答
質問者が選んだベストアンサー
・JavascriptのinnerHTMLがDOM-based XSSの発生源となるようで、HTMLのエスケープ処理が行うべきだとご指摘を頂きました。 それは入力された文字をそのままどこかに表示する場合だと思います。 質問者さまが使っているinnerHTMLは自前の文字なので問題ない気がします。 入力された文字の文字数を計算で使っているだけですし。 参考サイトも見てみましたが、例えばこことか、攻撃者が云々と言うのは入力可能な文字と言うことだと思います。 ---- var text = "...."; // 変数 text は攻撃者がコントロール可能な文字列 form.innerHTML = '<input type="text" name="key" value="' + text + '">'; ---- 質問者さまのコードではこのような入力された文字をそのまま表示する処理がないので大丈夫だと思います。 ・デフォルトでカウント文が表示されずにカウントもされていない状態です… dell_okさんにお聞きしてよいものか迷ったのですが、アドバイスお願い致します… そうですね。 あちらの質問は勉強になるので読むだけ読んでいます。 インターネット上での暗黙のルールみたいなものでマルチポスト扱いされるといけないので、こちらでの回答は控えておきます。 あちらで回答してくださるお返事もあったことですし、しばらく待ってみましょう。
その他の回答 (28)
- dell_OK
- ベストアンサー率13% (766/5720)
パーマリンクの話しを続ける必要はないかもといいましたが、 もし試すのでしたら、指定されたパーマリンクと、 $url = home_url('質問表示画面?'.$row->unique_id); この 質問表示画面 の部分を合わせてくださいね。
補足
回答ありがとうございます、IPv4とIPv6両方に対応できるように調べてみたのですが、データベースのテーブル設計が難しく分かりませんでした、アドバイスお願い致します。 /* IPv4かIPv6か判別して保存 */ if ($_SERVER['SERVER_ADDR'] == '2001:e41:AAAA:BBBB::1') { $ipkind = 'ipv6'; } elseif($_SERVER['SERVER_ADDR'] == '192.168.AAA.BBB'){ $ipkind = 'ipv4'; } $sql = 'INSERT INTO sortable(message,namae,stamp) VALUES(%s,%s,%d,%d)'; $sql = 'INSERT INTO sortable(ip_address) VALUES (IF(IS_IPV6(:ip_address)'; $query = $wpdb->prepare($sql, $_SESSION['message'], $_SESSION['namae'], $_SESSION['stamp'], $ipkind); $_SESSION['stamp'], $ipkind); ※参考サイト https://bleu-bleut.hatenablog.jp/entry/2012/09/16/211105 ※テーブル設計 https://qiita.com/i4M1k0SU/items/405e8d116dbfbcccad4a
- dell_OK
- ベストアンサー率13% (766/5720)
・IPv6の方が良さそうで $_SERVER['REMOTE_ADDR']を使うにあたってIPv6かIPv4を選択することはできません。 HTTPサーバーの設定でどちらかにしぼることはできるかも知れませんがそれはなしとして。 「IPv4、IPv6を問わず、文字列で入れておけばいいだけのような気もします」に対しての回答で数値化は不要と言う話しでした。 ・Cookieを使ってセッションデータを確認ページで使用していたと思うのですが、その他の4つの攻撃に対して対策は必要だと思われますでしょうか? セキュリティのことは私にはわかりません。 質問者さまがしたいかどうかで決めてください。 すでに十分な対策はされたのだと思いますがそうでもないのでしょうか。 ・アップロードファイルについてディレクトリに外部から操作が出来てしまうのではないかと心配なのですが、パーミッションは設定しておくべきでしょか? 操作出来るかどうかわかりませんが、心配ならパーミッションを設定してください。 ・後者のひとつの固定ページで作成してみたいと考えております。 そうですね。 それがいいと思います。 ・登録結果画面(single-results_list.php)はOKWABEでいう質問一覧を表示するホーム画面のようなページでしょうか? そうです。 私が言っている「登録結果画面」は質問を登録した結果を表示する画面のことです。 登録に成功したとか失敗したとか登録内容などの結果を表示するので「結果」と呼んでます。 一覧画面は一覧画面で、登録結果画面とは呼びません。 質問はしないで閲覧や回答だけをする人から見たら「登録」や「結果」と言う言葉は不自然です。 なので質問一覧画面と呼んだ方がいいと思います。 ファイル名からも「results」はなくした方がいいと思います。 ・登録結果画面(single-regist.php)は質問内容を表示して回答できる画面という認識ですが合ってますでしょうか? 私が言っているのはこの画面のことです。 この画面では回答できません。 質問者が質問した時にしか見ることができない画面だからです。 ・以前は表示されていたのですが?以降取得に失敗しております。 ではunique_idを表示してみてください。 ---- echo '<div><a href="'.$url.'">'.$row->unique_id; ---- ・パーマリンクは http://www.irasuto.cfbx.jp/雑談掲示板 質問表示画面/となっているのですが、UUIDは存在しているため原因がよくわからない状態です… 質問表示画面はそのパーマリンクではありません。 これです。 www.irasuto.cfbx.jp/質問表示画面? これは(single-complete.php)のパーマリンクになっていますか。 今後、質問一覧画面と質問表示画面はひとつの固定ページになるので、この話しを続ける必要はないかもしれません。
補足
Q.$_SERVER['REMOTE_ADDR']を使うにあたってIPv6かIPv4を選択することはできません。 HTTPサーバーの設定でどちらかにしぼることはできるかも知れませんがそれはなしとして。 「IPv4、IPv6を問わず、文字列で入れておけばいいだけのような気もします」に対しての回答で数値化は不要と言う話しでした。 A.回答ありがとうございます、こちらについては別途どうすれば良いのか質問してみます。 Q.セキュリティのことは私にはわかりません。 質問者さまがしたいかどうかで決めてください。 すでに十分な対策はされたのだと思いますがそうでもないのでしょうか。 A.回答ありがとうございます、こちらについては別途どうすれば良いのか質問してみます。セキュリティについてチェックしてみた方が良いとの指摘を頂いたので、もう少し詳しく見てみます。 Q.一覧画面は一覧画面で、登録結果画面とは呼びません。 質問はしないで閲覧や回答だけをする人から見たら「登録」や「結果」と言う言葉は不自然です。 ファイル名からも「results」はなくした方がいいと思います。 A.説明ありがとうございます、役割が違うので変更すべきですね、ファイル名をsingle-que_list.phpに変更いたしました。 Q.登録結果画面(single-regist.php)は質問内容を表示して回答できる画面という認識ですが合ってますでしょうか? 私が言っているのはこの画面のことです。 この画面では回答できません。 質問者が質問した時にしか見ることができない画面だからです。 A.説明ありがとうございます、single-complete.phpが回答可能なページになるのでしょうか? Q.www.irasuto.cfbx.jp/質問表示画面? これは(single-complete.php)のパーマリンクになっていますか。 今後、質問一覧画面と質問表示画面はひとつの固定ページになるので、この話しを続ける必要はないかもしれません。 A.回答ありがとうございます、www.irasuto.cfbx.jp/質問表示画面?と表示されているため合ってると思われます、原因を調べてみたところDEFAULT uuid();を設定時に取得に失敗しているようです。 ALTER TABLE `sortable` ADD `URL` VARCHAR(36) NOT NULL DEFAULT uuid();
- dell_OK
- ベストアンサー率13% (766/5720)
・どちらも文字列としては同じものだという解釈に至ったのですが別のものなのでしょうか? ※参考ページ(単に、IPv4、IPv6を問わず、文字列で入れておけばいいだけのような気もします。) そうですね。 私は質問者さまが、参考サイトの数値化には「速度面と安全面のメリットがある」とのことで、採用したのかと思ったのでなるべくコードをそのままにしましたが、文字列のアドレスを保存すればいいと私は思っています。 ・1点目、single-complete.phpの質問表示画面を固定ページとしてそのまま表示するようには想定されていないのでしょうか? そうですね。 言われる通り、single-results_list.phpを通すことを前提としています。 何故かと言うと、このOKWAVEもそうですがたいていのQ&Aサイトは、一覧画面は一覧画面、質問画面は質問画面、となっているからです。 例えば、PHPカテゴリーの一覧はこちらで、 https://okwave.jp/c256.html 質問のページはこちらです。 https://okwave.jp/qa/q10165331.html 勝手にこのようなイメージをしていましたが、質問者さまがどうされたいかは聞いていませんでした。 なので、これでよければ、と言うサンプルをお渡しした次第です。 話しはそれますが、見ての通り、OKWAVEでは質問ID(おそらくただの連番)がURLになっています。 この全世界から閲覧されるであろうOKWAVEでさえもただの連番をURLにしています。 なのでURLにUUIDを使うメリットを私は感じていません。 もともとは、difffのように、ごく短い、URLにするつもりかと思っていたので、長いUUIDになってしまった理由がわからなくなっています。 質問表示画面に直接アクセスされることは想定していません。 OKWAVEで言うとここにアクセスするようなものです。 https://okwave.jp/qa/ もし直接アクセスされた場合に対策するとしたら、一覧画面に遷移する、ですかね。 あるいは、一覧画面と表示画面はひとつの固定ページで作ってしまい、URIにUUIDが含まれていてなおかつ該当する質問があればその質問を表示、そうでなければ一覧を表示する、みたいな。 ・2点目、single-regist.phpとsingle-results_list.phpは同じ登録結果画面という解釈はあってますでしょうか? 別々の画面です。 一覧はただの一覧で、登録結果とは関係ありません。 先日も書きましたが、登録結果画面はもう二度と誰にも見れない画面なので、一覧とは別物です。 ・回答No.1でパーマリンクを統一していないため表示されないのではと教えて頂いたことについて、何故表示されないのか理由がわからないためアドバイスお願い致します。 「質問がみつかりません」が表示されてしまう件でしょうか。 それはわかりません。 今現在、パーマリンクなどを調整されて表示されているのでしたら気にしなくていいと思います。 もしまだ「質問がみつかりません」が表示されているのでしたら、UUIDが存在しないからとしか言えません。
補足
Q.私は質問者さまが、参考サイトの数値化には「速度面と安全面のメリットがある」とのことで、採用したのかと思ったのでなるべくコードをそのままにしましたが、文字列のアドレスを保存すればいいと私は思っています。 A.回答ありがとうございます、それぞれのメリットがあるということであればIPv4、IPv6の方が良さそうですね。参考サイトを確認したところIPv6の方が良さそうで、ほぼ無限に取得が可能なようです。 ※参考サイト https://www.thn.ne.jp/blog_detail/id=30 Q.そうですね。 言われる通り、single-results_list.phpを通すことを前提としています。 勝手にこのようなイメージをしていましたが、質問者さまがどうされたいかは聞いていませんでした。 なので、これでよければ、と言うサンプルをお渡しした次第です。 A.回答ありがとうございます、イメージ通りになります。 Q.この全世界から閲覧されるであろうOKWAVEでさえもただの連番をURLにしています。 なのでURLにUUIDを使うメリットを私は感じていません。 もともとは、difffのように、ごく短い、URLにするつもりかと思っていたので、長いUUIDになってしまった理由がわからなくなっています。 A.回答ありがとうございます、他の方にお聞きしてみたところ連番でも問題ないようです。1点心配なことがありまして、セキュリティに関して対策が必要な攻撃が5個ありそうです。 ※クリックジャッキング対策は以前メールフォームの際に実装していたコードで対策を考えております。 Cookieを使ってセッションデータを確認ページで使用していたと思うのですが、その他の4つの攻撃に対して対策は必要だと思われますでしょうか? アップロードファイルについてディレクトリに外部から操作が出来てしまうのではないかと心配なのですが、パーミッションは設定しておくべきでしょか? https://help.colorfulbox.jp/faq/cgi-permission/ // 他のサイトでインラインフレーム表示を禁止する(クリックジャッキング対策) header('X-FRAME-OPTIONS: SAMEORIGIN'); ※クリックジャッキング https://www.ipa.go.jp/security/vuln/websecurity/clickjacking.html ※クロスサイト・スクリプティング https://www.ipa.go.jp/security/vuln/websecurity/cross-site-scripting.html ※クロスサイト・リクエスト・フォージェリ https://www.ipa.go.jp/security/vuln/websecurity/csrf.html ※HTTPヘッダ・インジェクション https://www.ipa.go.jp/security/vuln/websecurity/http-header.html ※(13) ファイル、ディレクトリへの適切なアクセス制御をしていますか? https://www.ipa.go.jp/security/vuln/websecurity/sitecheck.html Q.もし直接アクセスされた場合に対策するとしたら、一覧画面に遷移する、ですかね。 あるいは、一覧画面と表示画面はひとつの固定ページで作ってしまい、URIにUUIDが含まれていてなおかつ該当する質問があればその質問を表示、そうでなければ一覧を表示する、みたいな。 A.回答ありがとうございます、後者のひとつの固定ページで作成してみたいと考えております。 Q.別々の画面です。 一覧はただの一覧で、登録結果とは関係ありません。 先日も書きましたが、登録結果画面はもう二度と誰にも見れない画面なので、一覧とは別物です。 A.回答ありがとうございます、まだ理解が出来ていないのですが… 登録結果画面(single-results_list.php)はOKWABEでいう質問一覧を表示するホーム画面のようなページでしょうか? https://okwave.jp/mypage 登録結果画面(single-regist.php)は質問内容を表示して回答できる画面という認識ですが合ってますでしょうか? Q.今現在、パーマリンクなどを調整されて表示されているのでしたら気にしなくていいと思います。 もしまだ「質問がみつかりません」が表示されているのでしたら、UUIDが存在しないからとしか言えません。 A.回答ありがとうございます、以前は表示されていたのですが?以降取得に失敗しております。 パーマリンクは http://www.irasuto.cfbx.jp/雑談掲示板 質問表示画面/となっているのですが、UUIDは存在しているため原因がよくわからない状態です… ※雑談掲示板 登録結果画面のURL http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e7%99%bb%e9%8c%b2%e7%b5%90%e6%9e%9c%e7%94%bb%e9%9d%a2/
- dell_OK
- ベストアンサー率13% (766/5720)
回答No.2さま。 お久しぶりです。 いつもありがとうございます。 カラム名を URL にしたのは私です。 うっかりしてました。 それっぽいものにすべきでしたね。 何入れるかわからない予定で走っていたと言うことでご勘弁を。 ふふふ。 質問者さま。 と言うことで、私も直した方がいいと思いますので、 phpMyAdminでカラム名を unique_id に変えてください。 コードの中のSQL文や変数もこれにならって直しておいてください。
補足
回答ありがとうございます、テーブルを修正いたしました。 ※カラム名を URL→unique_idに変更 https://imgur.com/8SF6LER.jpg ※IP保存画像 https://imgur.com/7FuesD5.jpg ※追加したカラム ALTER TABLE `sortable` ADD `unique_id` VARCHAR(36) NOT NULL DEFAULT uuid();
- dell_OK
- ベストアンサー率13% (766/5720)
・<a href="'.$url.'"></a>を名前、画像、メッセージ全体に1つだけかけたい場合どのようなコードにすればよいのでしょうか? 全部その中に書いてください。 ---- echo '<div><a href="'.$url.'">'; echo '<div>'.$row->namae.'</div>'; echo '<div>'.$view.'</div>'; echo '<div>'.mb_strimwidth($row->message, 0, 38, '・・・').'</div>'; echo '</a></div>'; ---- この書き方がいいかどうかわかりませんが、したいことはできます。 ひとつひとつの項目を<a></a>で括る方がいいのかも知れませんし、その辺のことは私にはわかりません。
お礼
申し訳ありません回答No.4で誤解を招くような補足を1点目に書いてしまいました。 正しくは、 1点目、single-complete.phpの質問表示画面を固定ページとしてそのまま表示するようには想定されていないのでしょうか? single-results_list.phpの質問一覧画面からsingle-complete.phpに還移したところ正しく表示されました。 single-complete.phpに固定ページとして直接アクセスした場合に質問が見つかりませんと表示されているため、single-results_list.phpを通すことを前提でdell_okさんは作られたのではないかと思っております。
補足
A.修正ありがとうございます、アドバイス頂いたことを踏まえてコードをすべて変更いたしました。 dell_okさんに3点お聞きしたいことがあります、アドバイスお願い致します。 1点目、single-complete.phpの質問表示画面を固定ページにして表示するようには考えていないのでしょうか? single-results_list.phpの質問一覧画面からsingle-complete.phpに還移する場合は表示されております。 single-complete.phpを固定ページとしてアクセスした場合に質問がみつかりませんと表示されているため、single-results_list.phpを通す必要があるのではないかと思いました。 2点目、single-regist.phpとsingle-results_list.phpは同じ登録結果画面という解釈はあってますでしょうか?dell_okさんにお聞きしてからsingle-regist.phpのトークン処理やデータベース登録コードを追加すべきか判断する予定です。 3点目、SEOを考えた結果に質問表示画面のパーマリンクを http://www.irasuto.cfbx.jp/qa/?xxxxxxxx_xxxx_xxxx_xxxx_xxxxxxxxxxxx にしたいのですがTemplate Name: complete はそのままにしておきたいです。 回答No.1でパーマリンクを統一していないため表示されないのではと教えて頂いたことについて、何故表示されないのか理由がわからないためアドバイスお願い致します。 ※最新コード https://wandbox.org/permlink/a1yvsEWq6kBDGAyd ※質問表示画面 http://www.irasuto.cfbx.jp/%e8%b3%aa%e5%95%8f%e8%a1%a8%e7%a4%ba%e7%94%bb%e9%9d%a2/ ※質問登録結果画面 http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf%e3%80%80%e7%99%bb%e9%8c%b2%e7%b5%90%e6%9e%9c%e7%94%bb%e9%9d%a2/
- dell_OK
- ベストアンサー率13% (766/5720)
・下記コードでIPアドレスは保存できるようですが、入力画面、確認画面、表示画面どのタイミングで追加すべきでしょうか? テーブルにカラムを追加してください。 以下のSQL文をphpMyAdminで実行していただければ追加できると思います。 ---- ALTER TABLE `sortable` ADD `ip` INT NOT NULL AFTER `URL`; ---- 登録結果画面(single-regist.php)に追加します。 取得できるIPアドレスがipv4かipv6かわからないのでひとまずipv4だとして以下のようにしてみてください。 ---- /* データベースに登録 */ $ip_address = $_SERVER['REMOTE_ADDR']; $ip_long = ip2long($ip_address); $sql = 'INSERT INTO sortable(message,namae,stamp,ip) VALUES(%s,%s,%d,%d)'; $query = $wpdb->prepare($sql, $_SESSION['message'], $_SESSION['namae'], $_SESSION['stamp'], $ip_long); ----
補足
A.アドバイスありがとうございます、登録結果画面に追加いたしました。昨日テラテイルの参考ページの回答を見たのですが、どちらも文字列としては同じものだという解釈に至ったのですが別のものなのでしょうか? ※参考ページ(単に、IPv4、IPv6を問わず、文字列で入れておけばいいだけのような気もします。) https://teratail.com/questions/msuhrhq3uyoxio
- AsarKingChang
- ベストアンサー率46% (3467/7474)
$url = substr($_SERVER['REQUEST_URI'], -36); $sql = 'SELECT * FROM sortable WHERE URL=%s'; これの値を画面に出してみて、どう展開されてるか?で クエリを作り出してそれをPHPMYADMINで 入力してみてください。 同じ結果になるはず。 =そこで原因がわかるってのが、最短コースかも おまけ、vqnporqs_wp1がカレントになってるか?(useされてるか?) も念のため確認。 他は、行ける気がする。 あと、URLって書いてるけど、中身UUIDに見えた^^ 直接の原因とは違うけど、unique_idだとか、わかりやすい 名前の方がいいかもね。
補足
アドバイスありがとうございます、SQLでSELECT * FROM sortable WHERE URLを確認したものと、$url = substr($_SERVER['REQUEST_URI'], -36);をvar_dump($url);で確認したものは一致しておりました。 質問表示画面のコード単体で固定ページにしたので表示されていない気がします。
- dell_OK
- ベストアンサー率13% (766/5720)
・昨日教えて頂いた質問掲示板 登録結果画面のタイトルから飛べるページをリンク先として考えておりました。 登録結果画面から飛ぶようには教えていないと思います。 登録結果画面は投稿した人が投稿したその時に一度しか見ることのできない画面です。 他の人はもちろんその人でも二度その画面を見ることはできません。 そのため誰でもいつでも見れる質問一覧画面が必要なのです。 ・コードをたどったところ質問表示画面の$sql = 'SELECT * FROM sortable WHERE URL=%s';で取得に失敗しているのではないかと考えたのですが、エラー原因は分かりますでしょうか? それはわかりませんが、先日回答したURLにはアクセスしてみましたか。 http://www.irasuto.cfbx.jp/雑談掲示板%e3%80%80質問表示画面/?29bbf0d7-34fd-11ee-ad27-e4434ba51b4c これでなら質問は表示されると思います。 一覧画面(~/雑談掲示板%e3%80%80登録結果画面/)のリンクは以下のようになっています。 http://www.irasuto.cfbx.jp/質問表示画面?29bbf0d7-34fd-11ee-ad27-e4434ba51b4c どちらのパーマリンクを使いたいのかわかりませんが、私のコードは「質問表示画面」のつもりでしたが、実際のパーマリンクは「雑談掲示板%e3%80%80質問表示画面」となっているようなので、どちらかに合わせてみてください。
補足
Q.登録結果画面から飛ぶようには教えていないと思います。 登録結果画面は投稿した人が投稿したその時に一度しか見ることのできない画面です。 他の人はもちろんその人でも二度その画面を見ることはできません。 そのため誰でもいつでも見れる質問一覧画面が必要なのです。 A.回答ありがとうございます、登録結果画面でも回答ができるように考えていたのですが確かにそれは回答画面と同じものを2度表示することになるので避けた方が良さそうですね。 表示画面と登録結果画面を別物だと勘違いしておりました、申し訳ありません。 Q.それはわかりませんが、先日回答したURLにはアクセスしてみましたか。 http://www.irasuto.cfbx.jp/雑談掲示板%e3%80%80質問表示画面/?29bbf0d7-34fd-11ee-ad27-e4434ba51b4c これでなら質問は表示されると思います。 どちらのパーマリンクを使いたいのかわかりませんが、私のコードは「質問表示画面」のつもりでしたが、実際のパーマリンクは「雑談掲示板%e3%80%80質問表示画面」となっているようなので、どちらかに合わせてみてください。 A.回答ありがとうございます、表示されております。パーマリンクを修正してみたのですがNULL 質問がみつかりませんと表示されております。 single-regist.phpとsingle-results_list.phpは同じ登録結果画面になると思うのですが、ここで質問一覧を表示させたい場合single-regist.phpのトークン処理やデータベース登録コードは維持したまま、先日アドバイス頂いた名前と画像とメッセージを一覧表示する形になるのでしょうか?dell_okさんがイメージしている作りと多少違うような気がしており確認しておきたいと思いました。 質問表示画面は回答者も質問者でメッセージのやり取りができる掲示板(回答画面)で想定しております。 ※現在のコード https://wandbox.org/permlink/vdOT30yXlr5xFyUh ※質問表示画面 http://www.irasuto.cfbx.jp/%e8%b3%aa%e5%95%8f%e8%a1%a8%e7%a4%ba%e7%94%bb%e9%9d%a2/
お礼
補足
A.アドバイスありがとうございます、脆弱性はinnerHTMLに設定する内容が制御できない内容である場合であり、変数leftが数値であることが保証されているように思われますので問題ないのではないかとアドバイスを頂いたのですが、少し神経質になりすぎていたかもしれません… leftの値が数値であることを証明されている場合は(エスケープ)必要なさそうですね、Wordpressを通すことでHTML側とJavascript側のかみ合わせが悪いようなので、再度確認して原因となりそうな部分を探してみます。 ※ページソース http://www.irasuto.cfbx.jp/%e9%9b%91%e8%ab%87%e6%8e%b2%e7%a4%ba%e6%9d%bf/