捕获SQL错误并阻止提交表单

时间:2015-08-04 16:42:24

标签: javascript jquery sql postgresql

我有一个小应用程序,允许用户使用HMTL表单,JavaScript和SQL(以及一些PHP来创建API)在mac上搜索位置以向CartoDB SQL数据库(PostgreSQL)http://docs.cartodb.com/cartodb-platform/sql-api.html提交注释与CartoDB的连接)。它适用于绝大多数用户,但有些提交没有通过。

我不知道为什么SQL提交有时会工作而不是其他工作,每次都对我有效。虽然我已将一个问题追溯到Safari 5.1,但我认为它也必须在其他浏览器中发生。主要问题是我无法看到任何错误,因此无法追踪。

以下是我的问题:

1。有没有办法捕获SQL错误并阻止提交表单?

2。有没有办法看到SQL错误,所以我可以追查问题?

以下是我用来提交评论的代码片段:

var tblName = "comment_collection"
var usrName = "***dney"

// FORM 
$("#allSubmitBtn").click(function (e) {
    //CHECK IF has a comment
    if (!notEmpty(document.getElementById('description1'))) {
        alert('Please enter a comment.');
        return false;
    }
    if (!notEmpty(document.getElementById('latlongit1'))) {
        alert('Sorry, there has been an error, please search for a location again.');
        return false;
    } else {
        currentNeighborhood = $('#neighborhoodName1').val();
        parcel = $('#parcel_id1').val();
        address = $('#pre_address1').val();
        userAddress = $('#UserAddress1').val();
        phoneNum = $('#phone1').val();
        emailAdd = $('#emailAddress1').val();
        userType = $('#userType1').val();
        otherUser = $('#otherUserType1').val();
        currentDescription = $('#description1').val();
        latlongy = $("input[name='latlongit1']").val();
        explainType = $('#explainType').val();
        currentProject = selectedCity.name;
        commentType = new Array();
        $("input:checkbox[name=commentType]:checked").each(function () {
            commentType.push($(this).val());
        });

        var sql = "INSERT INTO " + tblName + " (the_geom, project, description, name,comment_address,parcel_id,phone_number,email_address,comment_type,comment_type_other,user_type,user_type_other,profile_address,flag,loved) VALUES (ST_SetSRID(ST_GeomFromGeoJSON('";
        // var a = layer.getLatLng();
        // console.log(a);
        var sql2 = '{"type":"Point","coordinates":[' + latlongy + "]}'),4326),'" + currentProject + "','" + (currentDescription.replace(/'/g, "''")).replace(/"/g, "''") + "','" + (currentNeighborhood.replace(/'/g, "''")).replace(/"/g, "''") + "','" + address + "','" + parcel + "','" + phoneNum + "','" + emailAdd + "','" + commentType + "','" + explainType + "','" + userType + "','" + otherUser + "','" + userAddress + "','false','0')";
        var pURL = sql + sql2;
        console.log(pURL);
        submitToProxy(pURL);
        alert("Your Comments have been submitted");

        return true;
    }
});

enter image description here

2 个答案:

答案 0 :(得分:1)

这是非常危险/糟糕的代码。您正在客户端上构建sql并将其发送到要执行的服务器。什么阻止某人弹出他们的js控制台并执行submitToProxy('DROP DATABASE DATABASE()')

轰动你的网站,嘘声,太糟糕了。

即使你不从轨道上编写这些代码,只是为了确保它已经死了,并继续使用它,你不能捕获SQL异常,因为它们发生在服务器上,而不是在你的客户端。您的 SERVER 最多必须检查错误,并发送回适当的消息,例如

result = run_query(dangerous ql from user);
if (error occured) {
    return json_encode('error' => true, 'reason' => 'someone set us up the bomb'));
} else {
    return json_encode('error' => false, 'data' => query results);
}

然后你的客户端ajax必须做

$.ajax(....
   success: function (data) {
      if (data.error) { alert('boom!'); }
      else {... do stuff with data ...}

答案 1 :(得分:1)

这是教程基于的Github repo。安全性是一个主要问题,本教程随时提到。它更像是一个例证,任何实现它的人都应该修改脚本以使其更安全。

查看此拉取请求并尝试从中创建解决方案。它在一定程度上解决了这个问题。它将更多的查询移动到PHP脚本中,并且只允许从浏览器中输入字段名称。

https://github.com/enam/neighborhoods/pull/4