1

私はこの1つのエラーを理解するために1時間ほどを費やしました。それは私には正しいように見えますが、私ははるかに専門家ではありません。だから専門家に聞いてみようと思いました!私はこのエラーを受け取り続けます:

解析エラー:構文エラー、予期しない''(T_ENCAPSED_AND_WHITESPACE)、29行目の...に識別子(T_STRING)または変数(T_VARIABLE)または数値(T_NUM_STRING)が必要です

このコード行から:

eval("$var_value = $_REQUEST['{$value}']");

これがその周りのコードです。

function save_edits($var_name, $var_value)
{
    eval("{$var_name} = sql_safe({$var_value});");
    eval("mysql_query(\"UPDATE settings set {$var_name}='{$var_value}' where variable='{$var_name}'\") or die(mysql_error());");
}     
foreach ($_REQUEST as $key => $value)
{
    eval("$var_value = $_REQUEST['{$value}']");
    save_edits($value, $var_value);
}
4

2 に答える 2

11

欠落している]が表示されます:

eval("$var_value = $_REQUEST['{$key}\'");
                                     ^^

また、):がありません

eval("{$var_name} = sql_safe({$var_value};");
                                        ^^

ただし、特にs(ユーザー入力を意味する)では、多くのコストをかけて回避する必要があります。eval$_REQUEST現状では、このクエリはサイトに有害です。

http://your-site.com/?foo='];exec('rm%20*.*');

では、リファクタリングはどうですか?

function save_edits($var_name, $var_value)
{
    $clean_name = mysql_real_escape_string($var_name);
    $clean_value = mysql_real_escape_string($var_value);
    $sql = "UPDATE settings "
        .= "SET    value = '{$clean_value}' "
        .= "WHERE  variable = '{$clean_name}'";
    mysql_query($sql) or die(mysql_error());
}     
foreach ($_REQUEST as $key => $value)
{
    save_edits($key, $value);
}

ただし、実際に使用することを検討する必要があります。

CREATE TABLE settings
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  value VARCHAR(255)
);

次に、名前フィールドと値フィールドの両方をサニタイズできます。また、エクスプロイトをより適切に防ぐためにPDOの使用を検討することもできます。

于 2012-12-19T15:08:10.460 に答える
1

eval最大の問題は、文字列評価で無意味なコードを生成していることです。試す:

echo "$var_value = $_REQUEST['{$value}']";

その文字列の変数がどのように補間され、結果がどうなるかを確認してください。それが試みられているものでありeval、構文エラーを生成しているものです。

全体として、これは私が最近見た中で最も恐ろしいコードです。気にしないで。存在を忘れるeval。それを捨てる。ゼロから始めます。

于 2012-12-19T15:22:20.583 に答える