为什么addslashes()函数在php中的数组上不起作用?

时间:2011-05-01 03:51:18

标签: php arrays session escaping

我在数组中有一系列会话变量。当我在我的一个字符串变量中使用引号时,我尝试使用addslashes,因此我最终可以将其插入到DB中,但addslashes()函数不起作用。这是一个例子。

在评论栏中,我写了这个:

  

这是“评论”

我意识到这是一个问题所以我在将其输入数据库之前添加了一个函数,该数据库运行一系列Session变量,包括comments变量。

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

        foreach($strip_fields as $key => $value) {
            $key = addslashes($key);
        }

运行此函数后,我尝试回显注释变量$ _SESSION ['comments']

  

这是“评论”

所以我可以看到,addslashes函数以某种方式不能像我使用它那样工作。为什么addslashes功能不像我使用的那样工作?

这是我的解决方案(我从两个建议中都使用了一点)

$strip_fields = array(
            'employee_id', 'approved_by', 'delivery_email', 'full_name', 
            'first_name', 'last_name', 'title', 'title_2', 'dept_div', 
            'dept_div_2', 'email', 'comments', 'special_instructions'
        );

        foreach($strip_fields as $key) {
            $_SESSION[$key] = $conn->real_escape_string($_SESSION[$key]);
        }

5 个答案:

答案 0 :(得分:5)

你的问题暗示你实际上想要修改$_SESSION变量的内容,但这似乎不是一个好主意,因为你只会在调用脚本时一次又一次地添加斜杠(只是在没有看到所有代码的情况下进行观察)。

此外,您不应该使用addslashes来转义数据库,因为每个数据库(或数据库抽象层)都有自己的数据转义方式(例如mysql_real_escape_string或PDO预处理语句)

此外,$_SESSION和数据库是持久化数据的不同方式,混合它们可能是一个糟糕的设计选择。

评论后编辑......

如果您想将所有这些变量放入数据库,并且在此之前它们位于$_SESSION(如前所述可能不是最好的主意),并且您正在使用mysql php module ,那么你可以这样做:

$db_names=array(
    "comments",
    "employee_id",
    "approved_by",
    "full_name",
    "first_name",
    "last_name"
);
$clean=array();
foreach($db_names as $name)
    $clean[$name]=mysql_real_escape_string($_SESSION[$db_name]);
mysql_query("
        INSERT INTO comments_table 
        (
            comments,
            employee_id,
            approved_by,
            full_name,
            first_name,
            last_name
        )
        VALUES
        (
            '{$clean["comments"]}',
            '{$clean["employee_id"]}',
            '{$clean["approved_by"]}',
            '{$clean["full_name"]}',
            '{$clean["first_name"]}',
            '{$clean["last_name"]}'
        )
");

但是,最好不要使用mysql模块,而是使用mysqliPDO。每个都有不同的(并且由于多种原因更好)转义字符串的方式。

答案 1 :(得分:2)

这里有一些问题:

  1. 您正在将$_SESSION中的值复制到新变量。
  2. 您正在将密钥传递给addslashes(),但您已将值放入数组值。
  3. foreach()将数组中的值复制到$key$value中,因此您正在复制副本。
  4. 你应该可以使用引用,但我认为跳过它们会更清楚。

    $strip_fields = array(
            'comments', 'employee_id', 'approved_by', 'delivery_email', 
            'full_name', 'first_name', 'last_name']
        );
    
    foreach($strip_fields as $key) {
        $_SESSION[$key] = addslashes($_SESSION[$key]);
    }
    

答案 2 :(得分:1)

不要使用addslashes()来逃避SQL QUERY的价值!(抱歉喊叫)

对于MySQL,您的选择是mysql_real_escape_string(),但其他引擎有自己的转义函数。如果您尝试进行SQL注入攻击,addslashes()非常容易“傻瓜”。

您可以做的最好的事情不是逃避$_SESSION本身,而是创建副本,并使用array_map()mysql_real_escape_string()。这样你就可以保留原始的非转义版本。

$escaped_SESSION=array_map('mysql_real_escape_string', $_SESSION);

其他人已经解释了为什么foreach不是操作数组的最佳选择。它适用于您运行它的阵列的副本。 array_map()将对数组的所有元素应用回调,并返回结果数组。

答案 3 :(得分:0)

$array = array('comment' => $_SESSION['comment'], 'employee_id' => $_SESSION['employee_id']);  // other keys of session

foreach(array_keys($array) as $value){
    $array[$value] = addslashes($array[$value]);
}

使用$ array而不是$ _SESSION。

答案 4 :(得分:-1)

您需要将结果值存储回您正在回显的值

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

    foreach($strip_fields as $key => $value) {
        $strip_fields[$key] = addslashes($value); // Store it back into the strip_fields var
    }

同样@Gaurav指出你要清理数组数据,而不是索引/键。