2013-04-17 5 views
0

Je vais avoir un peu de chagrin avec cela et j'apprécierais de l'aide. Je l'ai essayé ce qui suit:

$result = mysql_query("SELECT this FROM that WHERE tFirstName = $_SESSION['FirstName'] And tLastName = $_SESSION['LastName']"); 

mais je reçois une erreur "T_ENCAPSED_AND_WHITESPACE inattendue, attendant T_STRING ou T_VARIABLE".

J'ai essayé un certain nombre de façons avec des guillemets simples et doubles autour des variables de session mais il semble toujours y avoir une erreur.

Finalement, je lui ai donné avec cela et les distribuèrent à la main fn $ et ln $ - alors utilisé que dans la requête:

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'"); 

Cela a bien fonctionné ... jusqu'à ce que je suis tombé sur un utilisateur avec le nom de famille O'Reilly et maintenant la citation unique dans leur nom le brise!

Aide! Une idée de comment je contourne ça?

+0

Considérez AOP ou MySQLi. 'mysql_ *' va faire une très longue marche dans le futur, et ne reviendra pas à la maison. – Amelia

+0

Aussi saint enfer lire sur l'injection SQL et ne touchez pas SQL jusqu'à ce que vous le faites. En outre, utilisez '{$ _braces []}' pour échapper dans une chaîne, mais vraiment, *** recherchez PHP Security ***. J'espère si mal que vous ne stockez pas les mots de passe, soit ... – Amelia

+1

Merci pour tous vos commentaires les gars. La base du code a été faite dans Dreamweaver il y a plus d'un an. J'avais besoin de quelque chose pour une école et je n'avais aucune idée de MySQL/PHP. J'ai appris beaucoup plus que d'habitude, mais j'ai encore beaucoup de chemin à faire. Je vais bientôt changer pour MySQLi. J'ai aussi lu un peu sur l'injection et essayé de pirater le mien en utilisant ce que j'ai vu sur le web, mais je ne pouvais pas. Je l'ai mis à 2 choses: l'URL ne montre que la page 'container' et n'inclut pas? Id = etc et tous les login utilisateurs sont authentifiés avec Active Directory. J'aimerais quand même savoir comme il est facile de pirater Tho! – detjo

Répondre

2

Vous devez évasion vos variables avant de les utiliser dans une requête SQL! Si vous ne le faites pas, de mauvaises choses peuvent se produire (SQL Injection!). Puisque vous utilisez mysql_, vous pouvez le faire.

$fn = mysql_real_escape_string($_SESSION['FirstName']); 
$ln = mysql_real_escape_string($_SESSION['LastName']); 

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'"); 

C'est exactement la raison de arrêt à l'aide mysql_ et passer à PDO (ou mysqli)! Avec ceux-ci, vous pouvez utiliser des "requêtes préparées" et ne jamais avoir à vous soucier de vous échapper à nouveau (il le fait pour vous). S'il vous plaît voir cette page: http://us2.php.net/manual/en/mysqlinfo.api.choosing.php

Une fois que vous basculez, vous voulez soit $mysqli->prepare ou $dbh->prepare.

Voir ce pour plus d'informations sur Injection SQL: http://bobby-tables.com/

0

pour échapper les guillemets simples, utilisez mysql_real_escape_string() avant de placer les variables dans la requête.

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '".mysql_real_escape_string($fn)."' And tLastName = '".mysql_real_escape_string($ln)."'"); 

La syntaxe correcte pour la première requête (sans échapper maintenant ...):

$result = mysql_query("SELECT this FROM that WHERE tFirstName = {$_SESSION['FirstName']} And tLastName = {$_SESSION['LastName']}"); 
0

Vous devez utiliser quelque chose comme mysqli_real_escape_string sur vos entrées:

$fn = mysqli_real_escape_string($link,$_SESSION['FirstName']); 
$ln = mysqli_real_escape_string($link,$_SESSION['LastName']); 

$link est l'identifiant de lien retourné par mysqli_connect() ou mysqli_init() . Puis:

$result = mysqli_query($link, "SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'"); 
0

Tout d'abord, je me répète encore une fois et dire - vous ne devriez pas utiliser les fonctions PHP mysql_* comme ils sont déconseillés. S'il vous plaît envisager de passer à mysqli ou PDO. Maintenant, le problème avec votre requête est que vous ne vous assurez pas que l'utilisateur ne sera pas en mesure d'injecter du code malveillant dans votre base de données. La requête ne fonctionnera pas avec le nom "O'Reilly" à cause de l'apostrophe '.C'est briser la requête MySQL. Avant d'insérer
données dans la base de données s'il vous plaît utiliser des fonctions comme une htmlspecialchars() et mysql_real_escape_string() (si vous insistez toujours coller avec mysql_*)

0

Vous pouvez résoudre cela en utilisant mysql_real_escape_string ou à l'aide PDO.

mysql_real_escape_string:

$str = mysql_real_escape_string($str); 

AOP:

// make a connection using mysql on PDO 
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
// make a query using params :fn and :ln 
$stmt = $dbh->prepare("SELECT this FROM that WHERE tFirstName = :fn And tLastName = :ln"); 
// bind value to these params 
// when binding params, PDO automaticaly escape it and quote it, it's the most safe way to avoid SQL Injection. 
$stmt->bindParam(':fn', $fn); 
$stmt->bindParam(':ln', $ln); 
// execute the created statement 
$stmt->execute(); 
// fetch data from statement 
$data = $stmt->fetchAll(PDO::FETCH_ASSOC); 
// dump data 
sprintf("<pre>%s</pre>", printr($data,true));