PHPからMySQLデータベースへの確立済みのmysqli接続を使用しているときに、この接続(つまり、この接続で認証されたユーザー)が特定のテーブル(または)にアクセスできるかどうかを確認する簡単な方法を探しています少なくとも、テーブルへのすべてのアクセス)。
問題がある場合、問題のテーブルは現在のUSED
データベースとは別のデータベースにあり、次の種類のクエリでアクセスしようとしています。
_SELECT * FROM some_other_database_on_the_same_server_as_the_currently_used_database.some_table WHERE id = 1
_
これまでの私の調査では、_SHOW GRANTS
_コマンドの手に負えないほど乱雑な生の文字列出力を手動で解析して解決する、途方もなく複雑な解決策しか見つかりませんでした。
これまでに試した(そして失敗した)ものは次のとおりです。
1。問題のテーブルに対して目的の操作を単純に実行し、失敗した場合はエラーコードを評価します。驚いたことに、問題のテーブルに対する適切な権限がない場合、SELECT
クエリ(たとえば、mysqli_query()
APIを使用して発行)は単にFalse
を返します。エラーコードまたはエラーメッセージがまったく報告されていない(接続オブジェクトのデバッガーで手動で、およびmysqli_error()
APIを使用して検査された)。これの問題は、False
も返されることです。照会されたテーブルはまったく存在しないため、アクセス許可の問題が原因で失敗したのか、それともまったく別の原因で失敗したのかは、これからはわかりません。
2。_HAS_PERMS_BY_NAME
_コマンド Microsoft SQL Server に相当するものを検索するには、常にただし、手間をかけずにGoogleから丁寧に群がって、MySQLの非常に不器用な_SHOW GRANTS
_コマンドに一貫して戻ってきます。
だから私の質問は、再び:
ホールド(またはハッキング)が禁止されていない状態で、mysqli接続に特定のMySQLテーブルへの必要なアクセス(または少なくとも他に何もない場合は読み取りアクセス)があるかどうかを確認するにはどうすればよいですか?
本当にmustこれを行う簡単な方法がありますよね?
おそらくこれがあなたの問題を解決するためにSELECTs
につながる可能性がありますか?
「ana_index」の場合:
mysql> SHOW GRANTS FOR ana_index@localhost;
| GRANT USAGE ON *.* TO 'ana_index'@'localhost' IDENTIFIED BY PASSWORD '*...'
| GRANT ALL PRIVILEGES ON `test`.* TO 'ana_index'@'localhost'
これらのテーブルにデータが入力されました:
mysql> SELECT * FROM mysql.user WHERE user = 'ana_index'\G
*************************** 1. row ***************************
Host: localhost
User: ana_index
Password: *1E62D0DB2482ED4455102B56D823285C02BAAF8F
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
(etc)
mysql> SELECT * FROM mysql.db WHERE user = 'ana_index'\G
*************************** 1. row ***************************
Host: localhost
Db: test
User: ana_index
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
(etc)
mysql.user
は、ユーザーがすべてのデータベースに対してどのような権限を持っているかを示します。
mysql.db
は、ユーザーが特定のデータベースに対してどの権限を持っているかを示します。この例ではtest
です。