0

とにかく、インストーラーをコーディングしています..それがglobal.phpファイルを作成するときに問題に遭遇しました.$ mysql_接続はファイルに表示されませんが、他のすべてのものは表示されますか?

これを挿入しようとしています

$mysql_host = 'localhost';
$mysql_user = 'root';
$mysql_name = '-----';
$mysql_pass = '-----';

global.php では、次のようになります。

 = 'localhost';
 = 'root';
 = '-----';
 = '-----';

$mysql_ がないことに気付きましたか?

これは、インストーラーのコードです。

    $db_name = trim($_POST['db_name']);
    $db_user = trim($_POST['db_user']);
    $db_pass = trim($_POST['db_pass']);
    $db_host = trim($_POST['db_host']);     

    $handle = fopen($setting['config']['folder'] . $setting['config']['file'], 'w');

$input = "<?php



$mysql_host = '".$db_host."';
$mysql_user = '".$db_user."';
$mysql_name = '".$db_name."';
$mysql_pass = '".$db_pass."';
?>

";

fwrite($handle, $input);
fclose($handle);

誰か助けてくれませんか?ありがとう

4

2 に答える 2

2
$input = "<?php
\$mysql_host = '$db_host';
\$mysql_user = '$db_user';
\$mysql_name = '$db_name';
\$mysql_pass = '$db_pass';
?>";

二重引用符で囲まれた文字列では、$ 記号は連結のようなものです。文字列にドル記号を挿入したい場合は、\バックスラッシュでエスケープする必要があります。

于 2013-03-21T09:50:41.903 に答える
0

文字列で二重引用符を使用しているため、PHP は文字列に含まれる変数名を解釈し、変数名ではなく変数の値を出力します。

これは、文字列を繰り返し開いたり閉じたりすることなく、文字列内に変数を埋め込むことができるようにするための PHP 機能です。皮肉なことに、それは実際の PHP 変数で行っていることとまったく同じです。

次の 2 つのオプションがあります。

  1. 文字列に一重引用符を使用するように切り替えます。これは、あなたが持っているのとまったく同じように機能します。

  2. 二重引用符を使用し続けますが、$PHP に解釈させたくない場合はバックスラッシュで記号をエスケープします。

    二重引用符を使用し続ける場合は、変数を文字列に埋め込むというオプションもあるため、引用符を開閉し続ける必要はありません。この場合、コードは次のようになります。

    $input = "<?php
    
    \$mysql_host = '{$db_host}';
    \$mysql_user = '{$db_user}';
    \$mysql_name = '{$db_name}';
    \$mysql_pass = '{$db_pass}';
    ?>
    ";
    

ただし、注意する必要があるもう 1 つの点は、$db_xx変数を から読み取るときに変数をエスケープしていないことです$_POST。これは、たとえば、ユーザーの名前またはパスワードに引用符が含まれている場合、無効な PHP コードが生成されることを意味します。

さらに、ユーザーがこのエラーを手法として使用して、システムに任意の PHP コードを挿入する可能性があります。このスクリプトは、最初にシステムをセットアップするときにのみ使用することを明確に意図していますが、これはコードの重大なセキュリティ上の欠陥であり、修正する必要があります。

于 2013-03-21T10:00:46.533 に答える