【问题标题】:PHP 5.3 dynamic array brokenPHP 5.3 动态数组损坏
【发布时间】:2014-11-03 16:46:13
【问题描述】:

我有一个切换到运行 PHP 5.3 的旧系统。出现的一个问题是设计用于编辑表中动态生成的值的代码。 editinvoice 数组没有值。有什么想法吗?

//Line Item x:<input type="text" name="editinvoice[lineitem_text_x]">
//Value x:<input type="text"    name="editinvoice[lineitem_amount_x]">

//edit values in the invoice table
$sqldata = array();
foreach   ($_POST['editinvoice'] AS $k => $v)
{
    $sqldata[] = "$k = '$v'";
}
$sql = "UPDATE db.invoices SET ".implode(',', $sqldata)." WHERE (booking_id = '$booking_id') LIMIT 1";
mysql_query($sql);

我知道 mysql 已经贬值,但是,没有资源可以重写系统,而且它位于 Intranet 上,因此无需担心 SQL 注入。

【问题讨论】:

  • 尝试转储 $sqldata$sql。他们有什么价值观?尝试在 mysql 中直接运行 echo $sql 的输出。它在说什么?
  • 乍一看,我没有发现任何兼容性问题。也许你没有启用mysql 扩展?
  • 我敢打赌 (a) 问题在于 PHP 5.3 中的 magic_quotes_gpc 已关闭,并且 (b) 您有一个巨大的 SQL 注入漏洞,这应该是您主要关心的问题。
  • 此代码在每个页面上运行以规避magic_quotes 的折旧。 foreach($_POST as $key => $val){ $_POST[$key] = addlashes($val); }
  • @lolka_bolka - ["editinvoice"]=> NULL 的值

标签: php arrays php-5.3


【解决方案1】:

您的代码暗示您期望$_POST['editinvoice'] 是一个数组。但是你说你在某处添加了magic_quotes_gpca的替代

foreach($_POST as $key => $val){
    $_POST[$key] = addslashes($val);
}

那么猜猜$_POST['editinvoice'] 数组发生了什么?

<?php

$expected = array("foo" => "bar");
$_POST["editinvoice"] = addslashes($expected);
assert ($expected == $_POST["editinvoice"]); // it's NULL

警告:addslashes() 期望参数 1 是字符串...
PHP 警告:assert(): 断言失败

您也可能会在错误日志中找到这样的警告。

您的代码依赖于magic_quotes_gpc=on。因此,再次打开它并删除那个损坏的解决方法。当您更新到 >=PHP-5.4 时,您仍然可以找到解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多