MySQL の超長い文字の切り捨て (「SQL-Column-Truncation」とも呼ばれます) は、2008 年 8 月にセキュリティ研究者の Stefan Esser によって提案されました。
MySQL の設定には sql_mode オプションがあります。sql_mode がデフォルトに設定されている場合、つまり STRICT_ALL_TABLES オプションがオンになっていない場合 (MySQLsql_mode のデフォルトはデフォルト)、MySQL は挿入時に警告のみを表示します。長すぎる値。エラーではなく、切り捨ての問題が発生する可能性があります。
テスト用に新しいテーブルを作成します。テーブル構造は次のとおりです (MySQL5.1):
CREATE TABLE USERS( id int(11) NOT NULL, //长度为7 username varchar(7)NOT NULL, password varchar(12)NOT NULL , )
次の SQL ステートメント (プロンプト メッセージの挿入) をそれぞれ挿入します。
①通常のSQL文を挿入します。
mysql> insert into users(id,username,password)values(1,'admin','admin');//成功插入,无警告,无错误 Query OK,1 row affected(0.00 sec)
② 間違った SQL 文を挿入すると、「admin」の右側にスペースが 3 つあり、長さが 8 となり、本来の指定長を超えています。
mysql> insert into users(id,username,password)values(2,'admin ','admin'); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec)
③間違った SQL ステートメントを挿入したため、長さが元の指定長を超えています。
mysql> insert into users(id,username,password) values(3,'admin x','admin'); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec)
MySQL は、3 つのステートメントがすべてデータベースに挿入されたことを示すプロンプトを表示しますが、最後の 2 つのステートメントでは警告が生成されました。 SQL文を実行することでデータベースに挿入されたかどうかを確認できます。
mysql> select username from users;
3つのデータがすべてデータベースに挿入されましたが、値が変更されていることがわかります。このとき、lengthで長さを取得して値の長さを決定します。
mysql> select length(username)from users where id =1 ;
2 番目と 3 番目のデータの長さは、指定された列の長さである 7 であることがわかります。データがデフォルトの列の長さを超えると、デフォルトで, MySQL は切り詰められます。
しかし、どうしてこれが攻撃になるのでしょうか?
ユーザー名が「admin」であるユーザーをクエリするとわかります。
mysql> select username from users where username='admin';
admin という名前のユーザーのみが照会されますが、長さが一貫していない他の 2 人の管理者ユーザーも照会されるため、セキュリティ上の問題が発生します。たとえば、次のように判断される管理者ログインがあります。文は次のとおりです。
$sql = "select count(*) from users where username='admin' and password='*******;
SQL 文にインジェクションの脆弱性がない場合でも、攻撃者が管理ページにログインする可能性があります。管理者ログインのユーザー名が admin であれば、攻撃者は「admin」ユーザーを登録するだけでバックエンドの管理ページに簡単にアクセスでき、有名な WordPress がこの方法で攻撃を受けています。
以上がMySQL で長い文字の切り捨てを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。