百度地图定位及图片上传安全

来自技术开发小组内部wiki
2015年1月26日 (一) 10:20马杰讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

百度地图定位

1,修复之前我们用的是myGeo.getPoint,这个方法回返回经纬度,但是由于我们生活在这个国度,你懂得,国家测量局要求“为了对个人隐私保护”不可以通过接口准确返回经纬度,要求二次加密。


2,百度内部其实开放了,解密算法BMap.Convertor.translate


3,通过解密发现,解密后的经纬度还是差太多,定位跑偏


4,尝试另一种方法:智能搜索,即localsearch类,可以根据任意关键词查询到对应的POI信息。 智能搜索有三种方法,分别是:search、searchInBounds和searchNearby。利用此三种方法可以搜索到百度地图数据库中所有POI信息。

重点介绍 search方法:


<script type="text/javascript">

var myGeo = new BMap.Geocoder();
var map = new BMap.Map("mapDIV");
var marker;
var options = {renderOptions: { 
map: map, 
panel: "results",//结果容器id 
//autoViewport: true, //自动结果标注 
selectFirstResult: false //指定到第一个目标
//enableRouteSearchBox: true,
//enableRouteInfo:false
}, pageCapacity: 1 };
var myLocalsearch = new BMap.LocalSearch(map,options);
map.enableScrollWheelZoom();
$('#area_id').change(function(){
var province = $('#city_id').find("option:selected").text();
var select = $('#area_id').find("option:selected").text();

shangquan();
var adress = $('#address').val();
if(select==){
var select = '黄浦区';
}
var select = province+select+adress;
getMapPoint(select);
});
function getMapPoint(select){
//这里用search方法的原因是以前的getPoint方法对地址解析定位不准确
myLocalsearch.search(select);
//搜索成功后的回调函数,对我们这次修复非常重要
myLocalsearch.setSearchCompleteCallback(function(results){
if(myLocalsearch.getStatus() == BMAP_STATUS_SUCCESS){
var poi = results.getPoi(0);
if(poi){
var pt2 = poi.point;
setPoint(pt2.lng,pt2.lat);//取得准确的经纬度
}
}else{
myGeo.getPoint(select, function(point){
if (point) {
//BMap.Convertor.translate(point,0,translateCallback);
lng=point.lng;
lat=point.lat;
setPoint(lng,lat);
}else{
getMapPoint('人民大道200号');
}
}, "上海市");
}
});
}
function setPoint(lng,lat){
var point = new BMap.Point(lng, lat);
var opts = {type: BMAP_NAVIGATION_CONTROL_LARGE}
var marker;
map.addControl(new BMap.NavigationControl(opts));
map.centerAndZoom(point, 16);
myGeo.getLocation(new BMap.Point(lng, lat), function(result){ 
if (result){ 
address = result.address;
}
var infoWindow = new BMap.InfoWindow(" "+address+"<input type=\"button\" value='确认这个位置' onclick='confirmPosition(\""+address+"\","+lng+", "+lat+")'/> ", opts);
marker.openInfoWindow(infoWindow);
});
if(marker){
marker.setPosition(point);
}else{
marker = new BMap.Marker(point);
//将标注置于其他标注之上。
//默认情况下,纬度较低的标注会覆盖在纬度较高的标注之上,从而形成一种立体效果。通过此方法可使某个标注覆盖在其他所有标注之上。
//注意:如果在多个标注对象上调用此方法,则这些标注依旧按照纬度产生默认的覆盖效果。
marker.setTop(true);
map.addOverlay(marker);
marker.enableDragging(true);
}
marker.setTitle("拖动此图标进行选择");
//var myGeo = new BMap.Geocoder();
marker.addEventListener("dragend", function(e){
var lng = e.point.lng;
var lat = e.point.lat;
var address = ;
myGeo.getLocation(new BMap.Point(lng, lat), function(result){ 
if (result){ address = result.address;}
var infoWindow = new BMap.InfoWindow(" "+address+"<input type=\"button\" value='确认这个位置' onclick='confirmPosition(\""+address+"\","+lng+", "+lat+")'/> ", opts);marker.openInfoWindow(infoWindow);
});
});
marker.addEventListener('dragstart', function(e){
this.closeInfoWindow();
});
}
function confirmPosition(address,lng, lat){
$(function(){
$("#lng").val(lng);
$("#lat").val(lat);
if(lng&&lat){
if($("#address").val()==||$("#address").val()=='详细地址,如西藏中路268号来福士广场3楼301室'){
$("#address").val(address);
}
alert("标记成功!");
return ;
}
});
}
</script>


记事狗相册图片上传安全

问题:记事狗相册插件图片上传安全漏洞,可以用抓包方式上传任何文件


原因: 1,没有验证上传的文件类型mime 2,没有验证上传的文件内容是不是图片 3,有有验证文件最后扩展名(后缀)


解决办法: 1,用如下方法得到文件mime类型:


$finfo = finfo_open(FILEINFO_MIME);

$mime = @finfo_file($finfo, $_FILES[$fieldname]['tmp_name']);

finfo_close($finfo);$regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/';

preg_match($regexp, $mime, $matches);

$matches[1]就是miem类型:image/jpeg…


2,用如下方法查看文件内容类型:


$file_data = getimagesize($_FILES[$fieldname]['tmp_name']);

$file_data['mime']就是文件内容类型


3,用如下方法查看文件后缀:

$file = $_FILES['Filedata']; $ext = pathinfo($file['name'], PATHINFO_EXTENSION);