2008-08-05 33 views
18

Khi bạn thực hiện truy vấn SQL, bạn phải xóa chuỗi hoặc người dùng có thể thực thi SQL độc hại trên trang web của bạn.Tôi cần gì để thoát khi gửi truy vấn?

tôi thường chỉ có một chức năng escape_string (blah), trong đó:

  • Thay thoát (\) với thoát kép (\\).
  • Thay thế dấu nháy đơn (') bằng dấu nháy đơn đã thoát (\').

Điều này có phù hợp không? Có lỗ hổng trong mã của tôi không? Có thư viện nào có thể làm điều này một cách nhanh chóng và đáng tin cậy cho tôi không?

Tôi muốn xem các giải pháp duyên dáng trong Perl, Java và PHP.

+0

cái gì đó phải đã đi sai trong việc hiển thị các dấu xồ nguợc, trong dòng 'Thay thoát() với thoát kép (\).' – bart

Trả lời

0

Ngôn ngữ nào đang sử dụng? Dường như tất cả chúng đều có các hàm thoát SQL được xây dựng sẵn sẽ tốt hơn để sử dụng. Ví dụ: PHP có mysql_real_escape_stringaddslashes.

2

Tôi cũng muốn thoát khỏi ý kiến ​​(dấu gạch ngang đôi)

-- 
0

Bạn nên sử dụng chuẩn bị phát biểu với placeholders. Bạn đang sử dụng PHP, .NET ... một trong hai cách, các câu lệnh chuẩn bị sẽ cung cấp bảo mật hơn, nhưng tôi có thể cung cấp một mẫu.

-1

Tôi không chắc liệu MySql có hỗ trợ truy vấn được tham số hóa hay không, nếu có, bạn nên thực hiện một nỗ lực để đi tuyến đường này. Điều này sẽ đảm bảo đầu vào của người dùng không thể làm bất cứ điều gì độc hại.

Nếu không, một số ký tự "xấu" ngoài những gì bạn đã đề cập sẽ là dấu chấm phẩy (;) và nhận xét (- và/* * /).

0

Trong PHP, Tôi đang sử dụng cái này và tôi sẽ đánh giá cao tất cả các bình luận về nó:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
     $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
     $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
} 


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
"; 

nhu cầu một xác minh hơn nếu một lĩnh vực có thể được NULL:

$picture = NULL; 
$theidyouwant = 7; 
$Name = 'WOOD'; 


if(is_null($picture)) 
    $p = 'NULL'; 
else 
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant); 

$requete = "SELECT * FROM Students 
    WHERE IdStudent={$IdS} AND 
    PictureStudent={$p} AND 
    NameStudent='{$Name}'; 
    "; 

Vậy là xong thưởng thức ! (hy vọng bài đăng sẽ gửi đúng dấu gạch dưới chứ không phải & # 95;)

1

Điều tuyệt vời để sử dụng trong PHP là PDO. Phải mất rất nhiều phỏng đoán trong việc đối phó với việc bảo vệ SQL của bạn (và tất cả các công cụ SQL của bạn nói chung). Nó hỗ trợ các câu lệnh đã được chuẩn bị sẵn sàng để tiến hành tấn công SQL Injection.

Một mồi tuyệt vời trên PDO được bao gồm trong cuốn sách The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed. Làm cho việc học một cách dễ dàng và tuyệt vời như một tham chiếu. Tôi thậm chí không phải suy nghĩ về bất cứ điều gì khác hơn là truy vấn SQL thực tế nữa.

0

Sử dụng Chuẩn bị/truy vấn tham số!

0

API MySQL C có riêng nó mysql_escape_string(). Sử dụng nó hoặc nó tương đương sẽ là tốt nhất.

0

Sử dụng câu lệnh đã chuẩn bị.

0

Trong truy vấn MySQL, khi sử dụng LIKE, hãy đảm bảo thoát khỏi ký tự "_" vì nó không bị thoát bởi mysql_real_escape_string.

Để tham khảo, kiểm tra here

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