我正在尝试用这个代码从数据库发送数据到客户端:
服务器端:
$prep = $pdo->prepare("SELECT * FROM user WHERE id=?");
$prep->execute([$_POST['id']]);
$user = $prep->fetch();
echo json_encode($user);
客户端$.ajax({
url : '/path/to/myaction',
data : {id : id},
complete : function(data){
console.log(JSON.parse(data));
}
});
结果类似于:
{id : 101,name : "Fudatura",birthdate : "1995/02/03",email : "fudatura@gmail.com"}
一切正常。我只是有点担心发布列结构。这是安全问题吗?我需要担心这个吗?
问题是:如果潜在的攻击者知道数据库中的列名,他会怎么做 ?
…
希望什么。它只是任意的名称。谁在乎那些名字是什么?这本身仍然不能让任何人访问他们不应该访问的任何内容。
已经说过,如果你的应用程序中有一个漏洞,允许别人访问他不应该访问的东西,例如SQL注入漏洞,知道数据库结构可以加速使用该漏洞做一些真正糟糕的事情。但是,仅仅混淆您的列名将不能增加任何实际的安全性,它可能只会减慢攻击者的速度,并迫使他们在黑暗中多戳一会儿。
从攻击者的角度来看这个非常好的攻击演练,以了解可能性。
底线是:不要麻烦了,它只会让你变得更加困难,而不会真正增加任何实际的安全性。你真正的弱点在别处。
如果你担心,你可以用别名重命名字段,只发送你需要javascript的字段。只要从你的选择中删除*,并将其替换为颜色和别名列表。
如果您不想暴露您的列结构,那么在json_encode之前运行$user变量的"for"循环,并创建您的自定义列数组。