0

我一直在研究一个代码,如果它们是字符串,则在你将它们输入数据库之前转义你的帖子,这是个好主意吗?这是代码:(更新为数字)

static function securePosts(){
    $posts = array();
    foreach($_POST as $key => $val){
        if(!is_numeric($val)){
            if(is_string($val)){
                if(get_magic_quotes_gpc())
                    $val = stripslashes($val);
                $posts[$key] = mysql_real_escape_string($val);
            }
        }else
            $posts[$key] = $val;
    }   
    return $posts;
}

然后在另一个文件中:

if(isset($_POST)){
    $post = ChangeHandler::securePosts();
    if(isset($post['user'])){
        AddUserToDbOrWhatEver($post['user']);
    }

}

这是好事还是在进入函数之前转义时会产生不好的影响(addtodborwhater)

4

2 回答 2

1

在使用用户输入时,应该区分验证和转义。

验证

在那里你测试用户输入的内容。如果您期望一个数字,请检查这是否真的是一个数字输入。可以尽早进行验证。如果验证失败,您可以立即拒绝它并返回错误消息。

逃跑

在这里,您将用户输入带入一个不会损坏给定目标系统的表单。应该尽可能地进行转义,并且只针对给定的系统进行转义。如果要将用户输入存储到数据库中,则可以使用类似函数mysqli_real_escape_string()或参数化 PDO 查询。稍后,如果您想在 HTML 页面上输出它,您将使用htmlspecialchars().

预防性转义用户输入或为多个目标系统转义它不是一个好主意。每次转义都会破坏其他目标系统的原始值,您可以通过这种方式丢失信息。

附言

正如YourCommonSense 正确指出的那样,使用转义函数并不总是足够安全,但这并不意味着您不应该使用它们。字符编码通常是安全工作的一个陷阱,明确声明字符编码是一个好习惯。在 mysqli 的情况下,这可以通过$db->set_charset('utf8');HTML 页面来完成,它有助于使用元标记声明字符集。

于 2013-01-24T14:25:34.743 回答
0

在数据库中插入任何内容之前转义用户输入总是一个好主意。但是,您还应该尝试将您希望是数字的值转换为整数(有符号或无符号)。或者更好 - 您应该使用准备好的 SQL 语句。有很多关于后者的信息here和PHP docs。

于 2013-01-24T12:54:35.053 回答