【发布时间】:2020-11-01 19:02:25
【问题描述】:
我一直在尝试以更安全的方式将函数组合在一起,通过调用要更新的不同列来防止注入或操纵插入。在您看来,此功能是否安全?如果不是,您会建议更好的方法,以及为什么。
当用户更新他们的个人资料或个人资料的特定部分时调用此函数,如您所见,我已经创建了一个数组,其中包含他们可以在该表中更新的所有项目。此外,我得到的 user_id 来自附加到他们会话的安全加密 JSON 令牌,他们没有发送。感谢您的宝贵时间。
function updateProfile( $vars, $user_id ) {
$db = new Database();
$update_string = '';
$varsCount = count($vars);
$end = ',';
$start = 1;
$safeArray = array( "gradYear", "emailAddress", "token", "iosToken", "country",
"birthYear", "userDescription" );
foreach($vars as $key => $value) {
if(in_array( $key, $safeArray )) {
if($start == $varsCount) {
$end = '';
}
$update_string .= $key . '=' . '"' . $value . '"' . $end;
}
$start++;
}
if($start > 0) {
$statement = "update users set " . $update_string . " where userId = '$user_id'";
$query = $db->updateQuery( $statement );
if($query) {
$response = array( "response" => 200 );
} else {
$response = array( "response" => 500, "title" => "An unknown error occured,
please try again");
}
}
【问题讨论】:
-
不,肯定不会。
-
为什么不完全正确?准备好的语句和参数是确保防止注入攻击的唯一方法。这是标准方法,你会从每个人那里得到相同的答案。所以如果你觉得你的情况有一些额外的维度,那么请说清楚。目前,您正在将用户输入连接到查询中,这是不安全的。限制可以更新的列是一种验证措施,但它无法防止注入攻击
-
您拥有的唯一安全措施是验证有效字段。没有任何输入清理,使您受到 SQL 注入的影响。考虑使用准备好的语句,而不是根据用户提供的数据制作查询。
-
@Markus AO 你能告诉我 1 个例子,说明如何对该语句执行任何恶意操作,以便我更好地理解。因为我显然很难理解这一点。请和谢谢你
-
????:“看起来您正在编写自己的 ORM。您是否考虑过使用已经编写、测试和广泛支持的 ORM,例如 RedBeanPHP、Doctrine 或 @ 987654323@?”
标签: php mysql sql-injection