Mybb1.8 データベース コア オペレーション update_query にはデータ損失を引き起こす低レベルのバグがあります
Mybb1.6 を 1.8 にアップグレードする過程で、数え切れないほどの問題に遭遇しました。最近、Mybb1.8 データベースのコア オペレーション update_query のコードに、先頭のゼロが欠落する重大なバグが発見されました。データが保存されたとき、数時間後、問題は私にあるのではなく、mybb のアップグレード コードにあることがわかりました。
データ テーブル: test
field
ID AUTO_INCREMENT
name varchar ( 60) not null
category varchar(5)
この表では、カテゴリは分類を表し、分類は共通コードで表され、合計最初の 2 桁の 01 ~ 99 は大カテゴリを表し、最後の 3 桁は小カテゴリを表します。 update ステートメントの Ajax を通じてテキストを更新し、background ステートメントの update_query を通じてデータを更新します。レベル 1.6 では正常に動作していましたが、レベル 1.8 ではアップデートが混乱していました。確認したところ、カテゴリ フィールドの前の「0」が抜けていました。この問題は、さまざまな手段を変更することで解決できるものではありません。最後に、Mybb のデータ操作コア ファイルを取り出してバージョン 1.6 と比較したところ、コードに低レベルのバグがあり、エラーが発生していることがわかりました。
下面是1.8版数据更新过程
Php代码
function update_query($table, $array, $where="", $limit="", $no_quote=false) { global $mybb; if(!is_array($array)) { return false; } $comma = ""; $query = ""; $quote = "'"; if($no_quote == true) { $quote = ""; } foreach($array as $field => $value) { if(isset($mybb->binary_fields[$table][$field]) && $mybb->binary_fields[$table][$field]) { if($value[0] != 'X') // Not escaped? { $value = $this->escape_binary($value); } $query .= $comma."`".$field."`={$value}"; } else { if(is_numeric($value)) { $query .= $comma."`".$field."`={$value}"; } else { $query .= $comma."`".$field."`={$quote}{$value}{$quote}"; } } $comma = ', '; } if(!emptyempty($where)) { $query .= " WHERE $where"; } if(!emptyempty($limit)) { $query .= " LIMIT $limit"; } return $this->write_query(" UPDATE {$this->table_prefix}$table SET $query "); }
而1.6版本是这样的
Php代码
function update_query($table, $array, $where="", $limit="", $no_quote=false) { if(!is_array($array)) { return false; } $comma = ""; $query = ""; $quote = "'"; if($no_quote == true) { $quote = ""; } foreach($array as $field => $value) { $query .= $comma."`".$field."`={$quote}{$value}{$quote}"; $comma = ', '; } if(!emptyempty($where)) { $query .= " WHERE $where"; } if(!emptyempty($limit)) { $query .= " LIMIT $limit"; } return $this->write_query(" UPDATE {$this->table_prefix}$table SET $query "); }
发生错误的是这样几句
Php代码
if(is_numeric($value)) { $query .= $comma."`".$field."`={$value}"; } else { $query .= $comma."`".$field."`={$quote}{$value}{$quote}"; }
传过来category的值可能是01002或08003,只要is_numeric($value)为真就是数字类型?!这是什么逻辑。其时mysql能自动处理识别字符型和数字型的差别,升级的1.8版把简单的事情复杂化,错误的逻辑导致bug发生,导致传过来的由数字组成的字符串存入数据库时前面的0丢失。如果前面不为0,就不会出错,这样导致数据一片混乱。
一直以来很欣赏Mybb简洁的代码和漂亮的系统架构,2M代码包括图片CSS等竟然能完成如此多的功能,给予用户良好的扩展能力。没想到翻出这样一个bug,见笑了。1.6至1.8改动很大,发布过于仓促。总体说来,Mybb不失一个漂亮简洁的php论坛。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
