Kullanıcı girişi, PHP, Javascript ve güvenlik

1 Cevap php

Kullanıcıların gelen ve adresleri girmek ve yön tablo almak bir yol tarifi hizmeti çalışıyorum yolunu gösteren bir harita ile birlikte (yani dönüş bilgileri tarafından çevirmek verir).

Aşağıda tam kaynak kodu (getdirections.php) 'dir:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <title>Directions</title>
 <style>
  * { font-family: Verdana; font-size: 96%; }
  label { width: 15em; float: left; }
  label.error { display: block; float: none; color: red; vertical-align: top; }
  p { clear: both; }
  .submit { margin-left: 12em; }
  em { font-weight: bold; padding-right: 1em; vertical-align: top; }
 </style>
 <script src="jquery-1.3.1.js" type="text/javascript">
 </script>
 <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false& amp;key=[Your Key Here]" 
type="text/javascript">
 </script>
</head>
<body onunload="GUnload()">
<div id="container">    
<div id="directform">
    <form id="direct" action="getdirections.php" method="get">
<p><label for="loc1">From Here:</label>
<input id="loc1" type="text" name="location1" class="required" /></p>
<p><label for="loc2">To Here:</label>
<input id="loc2" type="text" name="location2" class="required" /></p>
<p><input type="submit" value="Search" /></p>
    </form>
</div>
<?php
function filterInput ( $input ) {
$replacement = ',';
$input = preg_replace('/(\n|\r)+/', $replacement, $input);
$replacement = " ";
$input = preg_replace('/(\t)+/', $replacement, $input);
$inputarray = explode(' ', $input);
foreach ( $inputarray as $i => $value ) {
     $ch = '';
     if ( $value[strlen($value)-1] == ',') {
	$ch = ',';
	$value = substr($value, 0, -1);
     }

$value = 
      preg_replace('/^(\&|\(|\)|\[|\]|\{|\}|\"|\.|\!|\?|\'|\:|\;)+/', "", $value);

$inputarray[$i] = 
      preg_replace('/(\&|\(|\)|\[|\]|\{|\}|\"|\.|\!|\?|\'|\:|\;)+$/', "", $value);
$inputarray[$i] = $inputarray[$i].$ch;
}
$filteredString = implode(" ", $inputarray);
return $filteredString;
}

?>
</div>    
<table class="directions">
 <tr>
 <td valign="top">
  <div id="directions" style="width: 100%"></div>
 </td>
</tr>
<tr>
 <td valign="top">
 <div id="map_canvas" style="width: 250px; height: 400px"></div>
 </td>
</tr>
<td valign="top">
 <div id="directions_url"></div>
</td>   
</table>

 <noscript><b>JavaScript must be enabled in order for you to use Google Maps.</b> 
  However, it seems JavaScript is either disabled or not supported by your browser. 
  To view Google Maps, enable JavaScript by changing your browser options, and then 
  try again.
 </noscript>
 <script type="text/javascript">

 // This programming pattern limits the number of global variables
 // Thus it does not pollute the global namespace
 // for_directions is the only global object here.
 for_directions = function(){

// The map is loaded into the div element having id specified by mapid
// private variable
var mapid = "map_canvas";

// The direction listing is loaded into the div element having id specified by directionsid.
// private variable
var directionsid = "directions";

// From here
// private variable
var location1;

// To here
// private variable
var location2;

// The functions ( init and addevent ) 	are public methods of for_directions object
return {
	// Called on loading of this page
	// public method
	init: function (){
		location1 = "<?= filterInput($_GET['location1']) ?>" || 0;
		location2 = "<?= filterInput($_GET['location2']) ?>" || 0;
		var directions = document.getElementById(directionsid);
		directions.innerHTML = "Please check the address and try again";

		if ( GBrowserIsCompatible() && location1 != 0  && location2 != 0){
			mapAddress(location1, location2);
	        }
	},

	// This method is cross browser compliant and is used to add an event listener
	// public method
	addEvent:function(elm,evType,fn,useCapture){
		if(elm.addEventListener){
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	}
};

// Called from init 
// private method
    function mapAddress ( address1, address2 ){
    	var geocoder = new GClientGeocoder();
	var directions = document.getElementById(directionsid);
	var i = 0;

	geocoder.getLatLng( address1, function(point1){
	    if (point1){
		geocoder.getLatLng ( address2, function(point2){
		    if (point2){
			getDirections();
		    } else {
			directions.innerHTML = "Please check the address and try again";
		    }

		});
	    } else {
		directions.innerHTML = "Please check the address and try again";
	    }

	});
}

// Called from mapAddress to load the directions and map
// private method
function getDirections( ){
	 var gmap = new GMap2(document.getElementById(mapid));
	 var gdir = new GDirections(gmap,document.getElementById(directionsid));
	 gdir.load("from: " + location1 + " to: " + location2,
		    { "locale": "en_US" });
	 generateURL();
}

function generateURL(){
	var url = "http://maps.google.com/maps?saddr=";
	url += location1;
	url += "&daddr=";
	url += location2;
	var a = $("<a></a>").attr('href',url);
	$(a).text("Google Maps");
	$("#directions_url").append(a);
}
}();
// The (); above results in the function being interpreted by the browser just before   the page is loaded.

// Make for_directions.init as the listener to load event
// Note that the init method is public that why its accessible outside the object scope
for_directions.addEvent(window, 'load', for_directions.init, false);
</script>
</body>
</html>

Eğer sisteminizde bu kodu denemek eğer getdirections.php olarak adlandırın. Değiştirmek gerekir tek şey Google Maps API anahtarıdır. Sen anahtarını alabilirsiniz here.

Eğer anahtar parametre koymak anahtar oluşturmak kez (kolaylık için aşağıdaki satırı yeniden):

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false& amp;key=[Your key here]" 
type="text/javascript">

Yukarıdaki koddan da görüldüğü gibi, ben PHP ile giriş almak ve JavaScript işleme yapmak. Şimdi, kullanıcıların giriş her türlü (javscript, tehlikeli HTML, vb) uzak olsun istemiyorum. Ben PHP urlencode işlevini kullanarak çalıştı. Ancak, kodlanmış kullanıcı girişi javascript kodu ile kabul edilen ve hatta iyi girişine başarısız değildir.

Bu soruna geçici bir çözüm olarak ben / yerini alan bazı karakterleri silmek ve girişi aracılığıyla Javascript kodu denemek ve çalıştırmak için kullanıcı tarafından herhangi bir girişimi engellemek olacaktır PHP bir filterInput fonksiyon yazdım.

Bu iyi çalıştı. Kullanıcı kötü niyetli girdi vermek çalıştım Ancak, "+ alert (" merhaba ") +" Başlangıçta ve tırnak dahil bitiş hem de olduğu gibi, filterInput işlevi lider ve atık tırnak kesilmiş ve sonuç dizesi altında olduğunu söylüyorlar:

+alert("hello")+

Şimdi aşağıda kod çalıştırıldığında:

location1 = "<?= filterInput($_GET['location1']) ?>" || 0;

PHP gibi aşağıda dönüş değeri ile işlev çağrısı substitues:

location1 = "+alert("hello")+" || 0;

Script yürütme bir hata ile yukarıdaki hattı ile durdurur (eksik; deyimi önce)

Not, ben tırnak kesilmiş ve doğrudan ben almak istiyorum $ _GET ['Location1'] kullanılan değildi.

location1 = ""+alert("hello")+"" || 0;

("merhaba") alert idam olsun istiyorum!

Yani, ben bir düzeltme duyuyorum. Ben filtre girişi Eğer ben belirli kullanıcı girişi bir javascript hatası alıyorum ve ben filtre girişi yoksa ben kullanıcıların javascript her türlü yürütmek için izin verir.

Sorularım daha sonra:

  • Web girişi işlemek için uygun ve güvenli bir yolu nedir?
  • Dilleri geçiş kullanıcı girişi bu tür (PHP Javascript) Tamam mı?
  • Apart kullanıcının yaptığı güvenlik tehditleri başka ne tür javascript yürütmek mümkün olmaktan kod bu parça savunmasız?

Okumak için teşekkürler!

Lütfen yardım edin.

1 Cevap

Siz php json_encode ve javascript bir eval deneyebilirsiniz.

JS giriş yapılır aynı makine üzerinde çalıştırılır, ben güvenlik konusunda çok endişe olmaz. Bir hacker, kendi makine kesmek olabilir, hiçbir sorun olmalıdır.