Deb*_*awn 5 php mysql database security android
我在处理数据库方面不是很有经验.
我有一个Android应用程序,应该发送查询并从远程数据库服务器(MySQL)获取后续结果集.
我通过实际以JSON的形式将查询发送到服务器来完成此操作.然后,服务器脚本(PHP)将获取查询并执行它.然后将结果集再次解析为JSON并发送回Android应用程序.
我的PHP脚本
function run_query(mysqli $con, $query){
$res=$con->query($query);
return $res;
}
$reply = array();
if(isset($_POST['json'])) {
require_once __DIR__.'/config.php';
require_once __DIR__.'/DbController.php';
$json = json_decode($_POST['json'], true);
$query = $json['query'];
$con = (new DbController())->connect(DBNAME);
if(!$con){
$reply['suc']=false;
$reply['err_msg']=$con->error;
}
else{
$res = run_query($con, $query);
if(gettype($res)=="boolean"){
$reply['query_reply']=$res;
$reply['suc']=true;
die(json_encode($reply));
}
$i=0;
$reply['query_reply']= array();
while($row = $res->fetch_row()){
$reply['query_reply'][$i] = array();
for($j=0;$j<sizeof($row);$j++)
$reply['query_reply'][$i][$j]=$row[$j];
$i++;
}
$reply['suc']=true;
}
echo json_encode($reply);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,'query'密钥包含MySQL服务器执行的整个查询字符串.
我的问题是 - 这种方式是否包含我不知道的任何安全(或其他)漏洞?另外,有更好的方法吗?
我的一个项目伙伴建议我将查询分成不同的部分(Like-"query_type":"SELECT","table_name":"LOGIN_TABLE","where_args":"WHERE x = x",依此类推)并将其发送到服务器,然后在那里重建查询并执行.
但是,我不明白这会有什么帮助.任何建议将不胜感激.先感谢您.
你的方法有很多问题.任何人都可以对您的协议进行反向工程并在SQL服务器上执行他们想要的任何查询.因此,您的数据不仅可供任何人阅读,也可由任何人修改.换句话说,你会被黑客入侵.
通常的做法是将蛋糕分成几层.这意味着使用输入参数类型,返回值和权限定义一个由明确且指定良好的方法构建的API.
这个API可以用你喜欢的任何方式实现,jsonrpc,SOAP,xmlrpc,你的选择,甚至HTTP GET到php脚本返回json都可以.
最后一个选项有点笨重,但也很好,因为它允许你从你的网站内运行的javascript相同的api.无需拥有两个竞争API.
一个例子:
API get_user_profile(user_id INT);
INPUT:用户的整数id
RETURNS:此用户的表用户中的行,具体取决于他们的权限.
由于API在经过身份验证的会话中执行(使用cookie或其他),因此它知道用户发出请求的内容.因此,它会让用户看到他们的电话号码/电子邮件,但它不会将这些字段返回给其他用户,除非他们是管理员(这是一个简单的权限示例,当然可能更复杂).
因此,每个操作都需要自己的API.有些很复杂,例如通用搜索.您可以通过使其行为或多或少像网站一样简化,而不是编写自己的迷你语言并使用参数来指定搜索选项.客户端将用户在搜索字段中键入的内容发送到服务器(如HTTP表单),服务器决定如何处理它.
显然,如果您的API的任何参数直接插入到SQL查询中,那么SQL注入意味着您也会被黑客入侵.所以你需要做正确的事情,就像任何网站一样,暴露在邪恶互联网中的东西不断被攻击.
可以将客户端视为浏览器,将API称为URL,表单,xmlhttprequest等,将服务器称为PHP或其他任何服务器端语言.这基本上就是它.