将查询从Android发送到远程服务器数据库的正确方法

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",依此类推)并将其发送到服务器,然后在那里重建查询并执行.

但是,我不明白这会有什么帮助.任何建议将不胜感激.先感谢您.

peu*_*feu 6

你的方法有很多问题.任何人都可以对您的协议进行反向工程并在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或其他任何服务器端语言.这基本上就是它.

  • 您可以使用许多好的库来调用Web API,例如改装和排球.您可以使用此链接获取使用volley的工作示例https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/ (2认同)