2013-04-29 35 views
30

Tôi đã xây dựng một trang web sẽ sớm ra mắt và chỉ có một vài câu hỏi về ngăn ngừa SQL injection, tôi hiểu cách sử dụng mysqli_real_escape_string nhưng tôi tự hỏi liệu mình có phải sử dụng nó không tất cả các biến mà tôi nhận được cho câu lệnh SQL của mình và tôi có phải sử dụng nó khi tôi đang thực hiện các câu lệnh chọn hay chỉ trên chèn cập nhật và xóa? Ngoài ra, bạn sẽ khuyên bạn nên triển khai bảo mật nào khác trước khi tôi đặt trang web trực tiếp, cảm ơn trước vì đã trợ giúp!PHP MySQLI Ngăn chặn SQL Injection

+2

Câu hỏi của tôi liên quan đến 'mysqli_real_escape_string' câu hỏi mà bạn đang nói đến là về SQL injection nói chung ... – user2201765

+1

Câu hỏi này không nên bị đóng. Nó đã được cụ thể cho mysqli và không được trả lời trong liên kết được cung cấp bởi các kiểm duyệt. –

+1

@JG Estiot - cũng nói, quá nhiều người lập trình hậu môn - anh ta cần giúp đỡ - vì vậy giúp anh ta, đôi khi mất ít nỗ lực để trả lời hơn là giải thích tại sao bạn không muốn trả lời! Tôi đồng ý với bạn – kerry

Trả lời

35

Bất kỳ truy vấn nào cũng có thể được tiêm cho dù đó là đọc hoặc viết, liên tục hoặc tạm thời. Tiêm có thể được thực hiện bằng cách kết thúc một truy vấn và chạy một truy vấn riêng biệt (có thể với mysqli), làm cho truy vấn dự định không có liên quan.

Bất kỳ đầu vào nào cho truy vấn từ nguồn bên ngoài cho dù đó là từ người dùng hoặc thậm chí nội bộ phải được coi là một đối số cho truy vấn và tham số trong ngữ cảnh của truy vấn. Bất kỳ tham số nào trong truy vấn cần được tham số hóa. Điều này dẫn đến một truy vấn được tham số hóa đúng cách mà bạn có thể tạo một câu lệnh đã chuẩn bị từ và thực hiện với các đối số. Ví dụ:

SELECT col1 FROM t1 WHERE col2 = ? 

? là trình giữ chỗ cho thông số. Sử dụng mysqli, bạn có thể tạo câu lệnh đã chuẩn bị bằng cách sử dụng prepare, liên kết biến (đối số) với tham số bằng cách sử dụng bind_param và chạy truy vấn với execute. Bạn không cần phải sanitize đối số ở tất cả (trên thực tế nó là bất lợi để làm như vậy). mysqli thực hiện điều đó cho bạn.Quá trình đầy đủ sẽ là:

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?"); 
$stmt->bind_param("s", $col2_arg); 
$stmt->execute(); 

Ngoài ra còn có một sự khác biệt quan trọng giữa tham số truy vấntuyên bố chuẩn bị. Lời tuyên bố này, trong khi chuẩn bị, không phải là tham số và vì thế dễ bị tổn thương để tiêm:

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])"); 

Để tóm tắt:

  • Tất cả Queries nên được tham số đúng cách (trừ khi họ không có thông số)
  • Tất cả các đối số đối với truy vấn sẽ được coi là thù địch nhất có thể bất kể nguồn của chúng là gì
+0

nó sẽ được tốt đẹp để hiển thị như thế nào để sử dụng các báo cáo ma thuật với IN hoặc SET khoản với số lượng tùy ý của các yếu tố . Nếu không nó sẽ giống như một quảng cáo truyền hình - dễ dàng trên màn hình nhưng không sử dụng được ở nhà. –

+0

@YourCommonSense Tôi nghĩ rằng đó là một chút trong phạm vi của câu hỏi này, nhưng tôi có xu hướng làm một cái gì đó như câu trả lời này: http://stackoverflow.com/a/10698906/454533 –

+0

Cảm ơn bạn đã trả lời rất chi tiết! Điều này có vẻ như là một giải pháp tốt hơn so với sử dụng 'mysqli_real_escape_string' Tôi sẽ thách thức nhìn một chút nhiều hơn vào điều này và sau đó thực hiện nó, Cảm ơn bạn rất nhiều! – user2201765

4

Nó sẽ đóng cửa trong vài giây, nhưng chỉ để làm cho mọi việc thẳng

Tôi hiểu làm thế nào để sử dụng mysqli_real_escape_string

Tôi sợ bạn không.

nếu tôi phải sử dụng trên tất cả các biến mà tôi nhận được cho câu lệnh SQL của tôi

chắc chắn không phải.
chức năng này đã được sử dụng để định dạng chuỗi SQL chỉ

sao tôi phải sử dụng nó khi tôi đang làm câu chọn cũng hay chỉ trên bản cập nhật chèn và xóa?

ANY Câu lệnh SQL. Nhưng một lần nữa, không phải là "sử dụng mysqli_real_escape_string" nhưng định dạng chữ của bạn hoàn toàn và đúng cách

Ngoài ra những gì an ninh khác mà bạn muốn giới thiệu

liên quan đến an ninh SQL - bạn phải định dạng đúng không chỉ chuỗi nhưng literals của mọi loại loại. Và mỗi yêu cầu phải có bộ quy tắc định dạng riêng biệt

+2

Đây không phải là câu trả lời, vui lòng xóa nó. Đối với các chức năng nó tự tôi hiểu làm thế nào để sử dụng nó, tôi chỉ không 100% trên chính xác tất cả mọi thứ tôi cần phải sử dụng nó trên. – user2201765

+0

Vui lòng cải thiện câu trả lời này. Có nghĩa là gì bởi "bạn phải định dạng đúng ...". Đưa ra ví dụ hoặc quy tắc hoặc một cái gì đó ... – Chiwda

+0

@Chiwda ở đây nó đi: https://phpdelusions.net/sql_injection#formatting –

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