ugrás a tartalomhoz

Error: c00ce56e IE - Ajax, Php

Kalo · 2010. Szep. 17. (P), 16.41
Sziasztok!

Rengeteget olvastam és kerestem a neten de nem jutottam elörébb a problémámal!

Szóval van az oldalnak amin dolgozok egy regisztrációt aktiváló része, ahol meg kell adni a lakhelyet is. Ezt szeretném úgy megoldani hogy egy select elemben benne vannak a megyék és ha választ egy megyét akkor az alatta lévö select elemben már csak az adott megyéhez tartozó települések lennének. Nos az oldalon lightboxos fénykép galéria van így prototype-al próbálkoztam!

<script type="text/javascript">
function dynamic_select_city() {
var sId = document.getElementById("megyeId").value;
var oOptions = {
method: "GET",
parameters: "id=" + sId
};
var oRequest = new Ajax.Updater("varosok", "files/city.php", oOptions);
}
</script>

<select name="megye" id="megyeId" onChange="dynamic_select_city()" style="width:180px">
<option value="0">Válassz!</option>
<?php
$megyek = @mysql_query('SELECT * FROM megyek');
while ($egy_sor = @mysql_fetch_array($megyek)) {
print('<option value="'.$egy_sor['MegyeID'].'">'.$egy_sor['MegyeNev'].'</option>');
}
?>
</select>
<select name="varos" id="varosok" style="width:180px">
<option value="0">Válassz megyét...</option>
</select>

A city.php tartalma:
<?php
header('Content-Type', 'text/html; charset=UTF-8');
$kapcsolat = @mysql_connect('localhost', 'xxx', 'xxx');
if ($kapcsolat) {
@mysql_select_db('xxx');
if (array_key_exists('id', $_GET)) {
if ($_GET['id'] == 0) {
print('<option value="0">Válassz megyét...</option>');
}
else {
$varosok = @mysql_query('SELECT * FROM varosok WHERE MegyeID = \''.$_GET['id'].'\'');
print('<option value="0">Válassz!</option>');
while ($egy_sor = @mysql_fetch_array($varosok)) {
print('<option value="'.$egy_sor['VarosID'].'">'.$egy_sor['VarosNev'].'</option>');
}
}
}
}
?>


Nos FF, Opera és Chorme alatt kifogástalanul müködik! Viszont az IE c00ce56e hibával megáll és nem hozza a megyéhez tartozó településeket!

Olvastam neten hogy ez karakterkódolási probléma miatt van az oldal és az adatbázis is UTF-8. Számtalan módon próbálkoztam már, de valahogy nem jutottam eredményre.

Ez talán még segíthet a probléma felderítésében az IE azt írja hogy a prototype 1362-es sorában van a hiba!

if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }


Az 1362-es sor a:
this.headerJSON   = this._getHeaderJSON();


Várom mielöbbi segítségetek! Elöre is köszönöm!
 
1

php

csman007 · 2010. Szep. 17. (P), 19.26
a php inibe módosítsd a default charsetet
default_charset = "UTF-8"-ra.
Mellesleg megjegyzem csinálhatod akár jqueryben is csak add meg a noconflictot.
 var $j = jQuery.noConflict();
Azért is jobb a jquery mert sokkal jobb a támogatottsága mint a prototypenak.
2

re:php

Kalo · 2010. Szep. 20. (H), 21.22
köszönöm ez megoldotta probélmámat :)
3

Biztonság

gphilip · 2010. Szep. 20. (H), 23.32
Ne haragudj, hogy beleszólok, de a leendő felhasználóid adatainak megóvása érdekében legalább a bődületes SQL injection sebezhetőséget javítsd a kódodban, ha mást nem is.
4

Re: Biztonság

Kalo · 2010. Szep. 21. (K), 19.23
Köszönöm hasznos észrevételed! De sajnos nem olyan régóta foglalkozom a php-val így a biztonsági kérdések terén eléggé kezdő vagyok sajnos...

Ha megkérnélek kicsit kifejtenéd mire is gondolsz?

Előre is köszönöm
5

Re: Biztonság

gphilip · 2010. Szep. 21. (K), 19.38
Szia!

Persze. Valószínűleg mind így kezdjük, de nagyon fontos, tisztában legyél a biztonság témakörével onnantól, hogy felhasználók adatainak gyűjtésbe kezdesz.

Itt a válaszban szereplő linkek közül legalább a Security témakört érdemes lenne átnézned.
http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site

Esetünkben:

Mi történik az oldaladdal, ha a az alábbi paramétert adom át neki a GET-ben?

?id=1'+UNION+SELECT+table_name+AS+VarosNev+FROM+%60information_schema%60.%60TABLES%60+--


Szerintem ki fogja szépen listázni az összes táblát az adatázisszervereden. De gyakorlatilag bármilyen lekérdezést betehetek ide, és úgy válogatok az adatok között a szervereden, ahogy akarok :)

(nyilván nem teszteltem az oldaladon, ha elszúrtam a lekérdezést, a sebezhetőség attól még valós!)

Az alapvető szabály az, hogy minden, a felhaszálótól érkező adatot veszélyesnek kell tekintened és eképpen kezelned. Jelen esetben a get paraméter egésszé kovertálásával (intval) vagy escape-elésvel (mysql_real_escape_string).
6

Egy kis biztonsági help

Gixx · 2010. Szep. 21. (K), 20.12
Ha nem nagyon megy még a biztonság, örömmel felajánlom egyik korosodó, de még mindig hatékony kódomat, amit pár éve írtam és használtam, mielőtt áttértem a Zend Frameworkre.

class DataFormat

Elég jó szolgálatot tett anno. Igaz angolul, de szerintem remekül fel van kommentezve, így könnyű megérteni mit miért csinál. Volt egy újabb verziója is, ami telefonszám validátort is tartalmazott, de azt sajnos nem találtam meg. Illetve az email csak formai ellenőrzés, MX rekord ellenőrzést még nem tartalmaz. De kiindulásnak ez is jó.

Példa a használatra:

$data = array();
$error = array();
$data['username'] = DataFormat::_plain($_POST['username'], 20, DataFormat::REQUIRED);
$data['email'] = DataFormat::_email($_POST['email'], 128, DataFormat::REQUIRED);
$data['post_id'] = DataFormat::_int($_POST['id'],100000);

foreach($data as $key => $value){
	if($value === null){
		$error[] = $key;
	}
}

if(empty($error)){ 
	// a szintaxis színező valamiért kétszer írja ki az 'empty'-t (Chrome és IE alatt, FF-ben nem néztem).
	mysql_query('INSERT INTO...');
}
Remélem hasznát tudod venni! Sok sikert a munkádhoz!
7

Thx

Kalo · 2010. Szep. 22. (Sze), 06.44
Srácok ezer hála nagyon hasznos infokkal látatok el! :) A lekérdezést is kipróbáltam ami ebben a formában nem működött de el kell ismernem hogy a sebezhetőség ettől még valóban valós...

Mégegyszer nagyon köszönöm! :)
8

Little Bobby Tables

gphilip · 2010. Szep. 24. (P), 15.08
9

Módosított city.php

Kalo · 2010. Szep. 24. (P), 18.46
Nos végre időm engedte és modosítottam a city.php tartalmát a következőre:
<?php
$kapcsolat = @mysql_connect('localhost', 'xxx', 'xxx');
if ($kapcsolat) {
@mysql_select_db('xxx');
if (array_key_exists('id', $_GET)) {
$id = intval($_GET['id']);
if ($id == 0) {
?>
<option value="0">Válassz megyét...</option>
<?php
}
else {
$varosok = @mysql_query('SELECT * FROM varosok WHERE MegyeID = \''.$id.'\'');
?>
<option value="0">Válassz!</option>
<?php
while ($egy_sor = @mysql_fetch_array($varosok)) {
?>
<option value="<?php print($egy_sor['VarosID']); ?>"><?php print($egy_sor['VarosNev']); ?></option>
<?php
}
}
}
@mysql_close($kapcsolat);
}
?>


igy hogy most az GET id-t egésszé konvertálom így biztosítom hogy csak egész szám lehet a bemenete....

Jól értelmezem? :)
10

intval

csman007 · 2010. Szep. 25. (Szo), 14.42
a helyedben intval helyett is_numeric()-ot használnék
if (array_key_exists('id', $_GET) && is_numeric($_GET['id']))
{
   $id = $_GET['id'];
}
a megoldásod azért nem jó, mivel ha pl egy tömb kerül az id helyére akkor 1-et ad vissza mindig. az is_numeric()-val meg azt vizsgálod hogy szám-e az id.