2012-07-13 7 views
8

Possible Duplicate:
Best way to prevent SQL Injection in PHPPHP/MySQL - Najlepsze wykorzystanie i praktyka uciekających ciągów

Jaki jest najlepszy sposób na ucieczkę ciągi podczas wykonywania kwerendy? mysql_real_escape_string() wydaje się być dobry, ale nie wiem dokładnie, jak go poprawnie używać.

Czy ten kod poprawnie wykonuje zadanie?

<?php 
    /* Let's say that the user types "'#""#''"\{(})#&/\€ in a textfield */ 
    $newStr = mysql_real_escape_string($str); 
    $query = "INSERT INTO table username VALUES ($str)"; 
    mysql_query($query); 
?> 

EDIT:

Teraz mam ten kod:

 $email = $_POST['email']; 
    $displayName = $_POST['displayName']; 
    $pass = $_POST['pass1']; 

    $email = mysqli_real_escape_string($link, $email); 
    $displayName = mysqli_real_escape_string($link, $displayName); 
    $pass = mysqli_real_escape_string($link, $pass); 

    $insert = "INSERT INTO profiles (email, displayName, password) 
    VALUES ('$email', '$displayName', md5('$pass'))"; 
    mysqli_query($link, $insert) 
    or die(mysqli_error($link)); 

Ale otrzymuję ten błąd: masz błąd w składni SQL; sprawdzić podręcznika, który odpowiada twojej wersji serwera MySQL dla prawego składnię używaną w pobliżu '! "# #! ^!" #! " #!" #^'' '' '' w linii 1

Jeśli użytkownik wprowadza: '**!' #! # ^! "#!" * #! "#^'' ''

+3

'mysql_ *' funtions wkrótce będą przestarzałe. Użyj [PDO] (http://php.net/manual/en/book.pdo.php) lub [MySqli] (http://php.net/manual/en/book.mysqli.php). – Lion

Odpowiedz

6

Najlepszym sposobem nie jest całkowite uniknięcie ciągu, ale użycie sparametryzowanego zapytanie, które robi to za Ciebie.

+0

A jak utworzyć sparametryzowane zapytanie? –

+0

Parametryzowane zapytanie za pomocą [PDO] (http://php.net/manual/en/book.pdo.php). – Lion

+0

... używając mySQL. –

6

Korzystanie mysql_real_escape_string takiego będzie działać, ale trzeba:

  • Dodaj cudzysłowy wokół wartości.
  • Użyj wyniku $newStr, a nie oryginalnej wartości $str.
  • Zmień nazwę tablicy na nazwę, która nie jest zastrzeżonym słowem kluczowym.
  • Dodaj nawiasy wokół listy kolumn.

Spróbuj tego:

$query = "INSERT INTO yourtable (username) VALUES ('$newStr')"; 

Proponuję także, aby sprawdzić wynik z mysql_query($query) a jeśli wystąpi błąd, można sprawdzić komunikat o błędzie:

if (!mysql_query($query)) 
{ 
    trigger_error(mysql_error()); 
} 

należy również rozważ użycie jednego z nowszych interfejsów do MySQL. Stare funkcje mysql_*deprecated i nie powinny być używane w nowym kodzie.

+0

'table' było właściwie ok, ponieważ reprezentuje nazwę tabeli ... (" username "to nazwa pola) – Shomz

+0

Dzięki za komentarz. Dodałem to do listy rzeczy, które należy naprawić w tym wierszu kodu. –

+0

Dobra robota, nie mogę dać ci kolejnego +1 :) – Shomz