2012-07-13 23 views
8

Possible Duplicate:
Best way to prevent SQL Injection in PHPPHP/MySQL - Sử dụng và thực hành tốt nhất các chuỗi thoát

Cách tốt nhất để thoát khỏi chuỗi khi thực hiện truy vấn là gì? mysql_real_escape_string() có vẻ tốt nhưng tôi không biết chính xác cách sử dụng nó đúng cách.

Mã này có hoạt động đúng không?

<?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:

Bây giờ tôi có mã này:

 $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)); 

Nhưng tôi nhận được lỗi này: Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để có cú pháp đúng để sử dụng gần '! "#! # ^!" #! " #!" # ^' '' '' 'tại dòng 1

Nếu người dùng nhập: '**! "#! # ^!" #! "* #!" # ^' '' '

+3

'mysql_ *' chức năng không được chấp nhận. Sử dụng [PDO] (http://php.net/manual/en/book.pdo.php) hoặc [MySqli] (http://php.net/manual/en/book.mysqli.php). – Lion

Trả lời

6

Cách tốt nhất là không thoát chuỗi, nhưng thay vào đó hãy sử dụng tham số truy vấn, điều đó cho bạn đằng sau hậu trường.

+0

Và làm thế nào để bạn thực hiện một truy vấn tham số? –

+0

Truy vấn tham số bằng [PDO] (http://php.net/manual/en/book.pdo.php). – Lion

+0

... sử dụng mySQL. –

6

Sử dụng mysql_real_escape_string như thế sẽ làm việc, nhưng bạn cần phải:

  • Thêm dấu ngoặc kép quanh giá trị.
  • Sử dụng kết quả $newStr, không phải giá trị ban đầu $str.
  • Thay đổi tablename thành tên không phải là từ khóa dành riêng.
  • Thêm dấu ngoặc đơn quanh danh sách cột.

Hãy thử điều này:

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

Tôi cũng đề nghị bạn nên kiểm tra kết quả của mysql_query($query) và nếu có một lỗi, bạn có thể kiểm tra được thông báo lỗi:

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

Bạn cũng nên hãy xem xét sử dụng một trong các giao diện mới hơn cho MySQL. Các chức năng cũ mysql_*deprecated và không được sử dụng trong mã mới.

+0

'bảng' thực sự là ok vì nó đại diện cho tên bảng ... (' tên người dùng' là tên trường) – Shomz

+0

Cảm ơn nhận xét. Tôi đã thêm vào danh sách những thứ cần được sửa trong dòng mã đó. –

+0

Công việc hay, không thể cung cấp cho bạn +1 khác :) – Shomz

Các vấn đề liên quan