我正在尝试使用以下代码将数据从db发送到客户端:
在服务器端:
$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"}
一切都很好。我只是有点担心发布列结构。这是安全问题吗?我需要担心吗?
答案 0 :(得分:3)
问题是:潜在的攻击者可以做什么如果他知道数据库中的列名?
...
希望没事。它只是任意的名称。谁在乎这些名字是什么?这本身仍然无法让任何人访问他们无法访问的任何内容。
话虽如此, if 你的应用程序中有一个漏洞,允许某人访问他不应该访问的内容,例如:一个SQL注入漏洞,知道数据库结构可以加快使用该漏洞的速度。但是,只是模糊你的列名将不添加任何实际的安全性,它可能只会让攻击者稍微放慢一点,并迫使他们在黑暗中捅一会儿。
从攻击者的角度查看攻击的this very nice walkthrough以了解可能性。
最重要的是:不要打扰,只是在没有实际添加任何实际安全性的情况下让自己变得更加困难。你真正的漏洞在其他地方。
答案 1 :(得分:1)
如果您担心,可以使用别名重命名字段,并仅发送您需要的字段到javascript。只需从您的选择中删除*并将其替换为cols和aliases列表。
答案 2 :(得分:0)
如果您不想公开列结构,则在json_encode之前为$ user变量运行“for”循环并创建自定义列数组。