我一直在处理一个代码,如果它们是字符串,在你输入数据库之前它们就会逃脱你的帖子,这是个好主意吗?这是代码:(更新为数字)
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)
答案 0 :(得分:1)
使用用户输入时,应该区分验证和转义。
在那里测试用户输入的内容。如果你期望一个数字,你检查这是否真的是一个数字输入。验证可以尽可能早期完成。如果验证失败,您可以立即拒绝它并返回错误消息。
在这里,您将用户输入带入一个不会损坏给定目标系统的表单。转义应尽可能延迟,仅适用于给定的系统。如果要将用户输入存储到数据库中,可以使用mysqli_real_escape_string()
之类的函数或参数化的PDO查询。稍后如果您想在HTML页面上输出它,您可以使用htmlspecialchars()
。
预防性逃避用户输入或为多个目标系统转义它并不是一个好主意。每次转义都会破坏其他目标系统的原始值,您可以通过这种方式丢失信息。
P.S。
正如YourCommonSense正确指出的那样,使用转义函数并不总是安全的,但这并不意味着你不应该使用它们。通常,字符编码是安全工作的一个陷阱,并且明确声明字符编码是一个好习惯。对于mysqli,可以使用$db->set_charset('utf8');
来完成,对于HTML页面,可以使用元标记声明charset。
答案 1 :(得分:0)
始终一个好主意是逃避用户输入 BEFORE 在数据库中插入任何内容。但是,您还应该尝试将期望为数字的值转换为整数(有符号或无符号)。或者更好 - 您应该使用准备好的SQL语句。这里有很多关于后者和PHP文档的信息。