我有一个小应用程序,允许用户使用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;
}
});
答案 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脚本中,并且只允许从浏览器中输入字段名称。