UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#052 PHPのaddslashes関数の使い方と注意点

記入日:2023-03-01 編集日:2023-03-01

SQL見るだけクエリ。今回は、PHPのaddslashes関数の使い方と注意点について考えてみようと思います。

この記事を読むと(約5分)
PHPのaddslashes関数の使い方と注意点がイメージできます。

addslashes関数は、PHPの組み込み関数で、文字列に含まれる特定の文字の前にバックスラッシュを付けて返す関数です。エスケープされる文字は、シングルクォート(')、ダブルクォート(")、バックスラッシュ(\)およびヌル文字です。例えば、"Hello 'world'"という文字列にaddslashes関数を適用すると、"Hello \'world\'"という文字列が返ります。

 

addslashes関数は、PHPが評価する文字列に含まれる特定の文字をエスケープする場合に使われます。例えば、eval関数を使って文字列を実行するときに、シングルクォートやダブルクォートなどの文字がエラーを引き起こさないようにするために、addslashes関数を使ってバックスラッシュでエスケープします。また、データベースに文字列を保存したり、データベースのクエリを実行したりするときにも、addslashes関数を使って文字列を整形することができます。ただし、データベースによっては、addslashes関数ではなく専用の関数(例えばmysql_real_escape_stringやpg_escape)を使うほうが安全だということに注意してください。

 

addslashes関数を使わない方がいい場面として、SQLインジェクションやディレクトリトラバーサルという脆弱性があります。SQLインジェクションとは、ユーザーから入力された文字列に含まれる特殊な文字(例えばシングルクォートやセミコロン)をエスケープせずにそのままデータベースのクエリに組み込んでしまうことで、意図しない操作や情報の漏洩が起こる可能性がある攻撃です。addslashes関数は、これらの特殊な文字にバックスラッシュを付けてエスケープすることで、SQLインジェクションを防止しようとする目的で使われることがあります。しかし、addslashes関数はデータベースの文字コードによっては正しく動作しない場合があります。例えば、GBKやSJISなどのマルチバイト文字コードでは、バックスラッシュの後ろに続く文字が別の意味を持つ可能性があります。そのため、addslashes関数ではなく、データベース特有のエスケープ関数(例えばmysql_real_escape_stringやpg_escape)やプリペアドステートメント(例えばPDO::prepareやmysqli::prepare)を使うほうが安全だと言われています。

 

ディレクトリトラバーサルとは、ユーザーから入力された文字列に含まれる特殊な記号(例えば…/や/0)をエスケープせずにそのままファイルパスに組み込んでしまうことで、意図しないファイルの読み込みや書き込みが起こる可能性がある攻撃です。addslashes関数は、これらの特殊な記号にバックスラッシュを付けてエスケープすることで、ディレクトリトラバーサルを防止しようとする目的で使われることがあります。しかし、addslashes関数はNULL文字(/0)を正しくエスケープしない場合があります。NULL文字はファイルパスの終端を示す記号ですが、PHPでは無視されます。そのため、addslashes関数でエスケープされたNULL文字を含むファイルパスをrequireやincludeなどの関数に渡すと、本来読み込むべきではないファイルが読み込まれる可能性があります。そのため,addslashes関数ではなく,NULL文字以外も含めてすべての特殊記号を除去する方法(例えば,正規表現やフィルター機能)を使うほうが安全だと言われています。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。