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