[Ajax, JSON] Problemen met de eval functie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik zit vast met het volgende probleem.
Ik probeer dmv een httprequest gegevens op te vragen.
De gevraagde gegevens worden middels de functie json_encode() op de php pagina gecodeerd en terug gezonden. Nu wil ik met deze gegevens aan de slag op de javascript pagina, maar de eval functie geeft elke keer problemen. Er komt dan een melding dat er een ; wordt verwacht ipv de regel waarop eval voorkomt. Als ik die weghaal is de foutmelding wel weg.

Als ik dan vervolgens in een testpagina de gegenereerde json text handmatig door eval heen doe, dan werkt het ineens weer wel. Heeft er iemand een idee hoe ik dit kan oplossen?

Tevens kwam ik tegen dat er een betere functie bestaat parseJSON. Ik weet alleen niet in wat voor object ik dan moet aanmaken om hiermee te werken.

De code die ik probeer is alsvolgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<html>
<head>
<script type="text/javascript" language="javascript" src="phpfunctions.js"></script>
<script type="text/javascript" language="javascript" src="ajax.js"></script>
<script language="JavaScript">
    var loginScript = "ajax-test.php";
    
    function checkUsername(){
        AjaxPostData(loginScript, Form2Ajax('testForm'));
        
        document.getElementById("T1").innerHTML = responceData;
        var login = eval(responceData);
    }
    
    function Login(){
        AjaxPostData(loginScript, Form2Ajax('testForm'));
        document.getElementById("T1").innerHTML = responceData;
    }
    
    function isLoggedIn(){
        AjaxPostData(loginScript, "checklogin=true");
        
        
    }
        
</script>
</head>
<body onload="isLoggedIn();">
<div id="T1" style="border:1px solid black;height:40;width:300;padding:5"></div><br />
<form name="test" id="testForm">
    Gebruikersnaam: <input type="username" name="username" onblur="checkUsername();" /><br />
    Wachtwoord: <input type="password" name="password" /><br />
    <button onclick="Login();">Click</button>
</form>
</body>
</html>

responceData bevat hier bijv. de string: {"username":false,"password":false,"loggedin":false}

telefoontoestel


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
JavaScript:
1
2
3
4
5
6
7
8
9
10
function parseJSON ( string )
{
    try
    {
        return /^("(\\.|[^"\\\n\r])*"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+$/.test(string) && eval('(' + string + ')');
    }
    catch (e) {}

    return false;
}
Ik weet alleen niet in wat voor object ik dan moet aanmaken om hiermee te werken.
Gewoon, zoals je het nu hebt.

PHP:
1
2
3
4
5
$data = array ();
$data['naam'] = 'karel';
$date['leeftijd'] = 49;

echo json_encode ( $data );


JavaScript:
1
2
3
4
var result = parseJSON ( responceData );

alert ( result.naam );
alert ( result.leeftijd );

[ Voor 49% gewijzigd door XWB op 05-05-2009 08:52 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Voor JSON kun je beter een goede library pakken, want er kleven behoorlijk wat beveiligings-issues aan het 'domweg' eval'en.

Voor alleen JSON functionaliteit zou je eventueel ook kunnen kijken op http://www.json.org/.

Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

jQuery doet het zelfs automagisch. Dus als je daarbij bijvoorbeeld de $.getJSON functie gebruikt, krijg je in de cvallback automatisch een object terug die kant-en-klaar ge-json-parsed is. Voorbeeldje:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
$("form").submit(function() {
  $.getJSON(
    "/pad/naar/json/handler",
    {
      username: $("input[name=username]", this).val(),
      password: $("input[name=password]", this).val()
    },
    function(data) {
      console.log(data); //Of verzin wat leuks
    }
  );
  return false;
});

[ Voor 20% gewijzigd door _Thanatos_ op 05-05-2009 10:04 ]

日本!🎌


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

En jQuery injecteert het automatisch ook als script-tag als je een callback-argument meegeeft in de url. Hier moet je serverside wel even rekening mee houden natuurlijk, maar dan is het voordeel dat het zonder problemen cross-domein werkt.

Acties:
  • 0 Henk 'm!

  • dB90
  • Registratie: Oktober 2004
  • Laatst online: 03-09 17:28
En zo?

code:
1
eval('(' + responseData + ')');

Webberry Webdevelopment


Acties:
  • 0 Henk 'm!

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

Topicstarter
Ik ben er nu druk mee bezig gewerkt en het werkt inmiddels wel. Aangezien ik al vaker heb gehoord dat eval niet prettig is om te gebruiken ben ik verder wezen zoeken. Ik gebruik nu de lib json_sans_eval.js. Deze doet het zoals de titel al zegt zonder gebruik van eval en zal als het goed is dus wel veilig moeten zijn.

Bedankt voor de reacties.

telefoontoestel

Pagina: 1