2010-01-12 20 views
8

URL sẽ được"đủ sanitization" là gì cho một URL

  1. lưu cơ sở dữ liệu MySQL
  2. Được sử dụng để hiển thị một hình ảnh trên profile của người dùng

sẽ strip_tags() và mysql_real_escape_string() là đủ?

+1

Tôi đã nhận được một số câu trả lời hay cho một câu hỏi tương tự; hãy xem http://stackoverflow.com/questions/549987/what-is-the-best-way-to-filter-urls-for-input nếu bạn muốn. Giải pháp tốt nhất có lẽ là hoàn toàn xây dựng lại URL như Mike Boers trả lời gợi ý. – JAL

Trả lời

16

"Đủ vệ sinh" hoàn toàn phụ thuộc vào môi trường bạn đang nói đến. Sanitization cho MySQL nên được xem xét hoàn toàn riêng biệt từ vệ sinh cho đầu ra web và bạn nên xử lý chúng một cách riêng biệt để tránh nhiều rắc rối.

Vệ sinh cho MySQL

  • mysql_real_escape_string() sẽ khử trùng một phần dữ liệu và làm cho nó an toàn để đặt bên trong một truy vấn SQL.
  • Bất kỳ loại dữ liệu độc hại nào khác, chẳng hạn như thẻ HTML bên trong chuỗi, phải được bỏ qua hoàn toàn. Cố gắng thao tác nó ở đây sẽ dẫn bạn đến đau đầu khi bạn cố gắng "bỏ thao tác" nó sau này sau khi lấy nó ra khỏi cơ sở dữ liệu. Dữ liệu web "xấu" không thể gây hại cho cơ sở dữ liệu của bạn.

Vệ sinh cho đầu ra

  • htmlspecialchars($val) lúc đầu ra sẽ ngăn chặn bất kỳ thẻ độc hại khỏi bị trả lại, vì <> nhân vật được chuyển đổi thành cơ quan đại diện tổ chức của họ và không trả lại như delimiters thẻ.
  • Sử dụng modifier ENT_QUOTES nếu bạn đang cung cấp một cái gì đó bên trong thuộc tính dẫn lời một phần tử HTML, chẳng hạn như <input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

Đó nên là tất cả các bạn cần, trừ khi bạn có yêu cầu đặc biệt. strip_tags() không thực sự được sử dụng để vệ sinh, vì nó có thể bị lừa với HTML được tạo thành sai. Sanitization là một mục tiêu xứng đáng, và nếu bạn có thể giữ cho bối cảnh của bạn riêng biệt, bạn sẽ gặp phải ít vấn đề hơn với thao tác dữ liệu giữa chúng.

+1

+1 chỉ khử trùng khi cần thiết. Tất nhiên, vệ sinh cho SQL là * ác *, chỉ cần sử dụng truy vấn parametrized ... – sleske

+0

@ sleske - vâng, đó là sự khôn ngoan hiện hành những ngày này. Sanitizing cho SQL không phải là ác mặc dù. Nhiều hệ thống sẽ sử dụng các phiên bản hoặc trình điều khiển cơ sở dữ liệu cũ hơn và có thể không có quyền truy cập vào MySQLi. Lý do duy nhất làm vệ sinh được một đại diện xấu là vì mọi người * quên làm điều đó *. Các truy vấn được chuẩn bị chỉ trừu tượng hóa việc khử trùng thủ công (trong số các lợi ích khác). – zombat

+0

Ý của bạn là "Truy vấn tham số"? – aslum

1

Có thể an toàn hơn và tốt hơn để gọi htmlentities() trên chuỗi thay vì đếm trên strip_tags().

strip_tags() sẽ không loại bỏ ký tự html đặc biệt như '"&

ví dụ, nếu mã của bạn là:

<img src="<?= strip_tags($myVar) ?>"> 

$myVar = '">something goes here<'; 

sau đó bạn kết thúc với:

<img src="">something goes here<"> 

Đó là khá rõ ràng là gốc của một lỗ XSS; một khai thác thực sự được để lại như một bài tập cho người đọc.

0

tôi ban đầu upvoted câu trả lời của Frank, nhưng nghĩ đến một vấn đề: htmlentities() sẽ phá vỡ các url quy phạm pháp luật như thế này:

http://www.mywebsite.com/profile?id=jojo&w=60&h=60

lẽ tước dấu ngoặc nhọn + mysql_real_escape sẽ là đủ?

+0

Một URL hình ảnh không được có ký hiệu và như vậy trong nó? – aslum

+0

Tại sao không? Tập lệnh là một nguồn hình ảnh hoàn hảo hợp lệ. –

+2

htmlentities() sẽ hoạt động tốt trên URL đó. Trong thực tế, mã hóa & như & trong thuộc tính của bạn là bắt buộc theo các tiêu chuẩn. '' là html hợp lệ (và trình duyệt sẽ xen kẽ URL là 'example.com/? A & b' như mong đợi). Mặt khác, '' không hợp lệ - tuy nhiên, các trình duyệt có thể sẽ làm điều không sao. Trường hợp tại điểm, nếu bạn Xem Nguồn trên URL trong bài đăng của mình, bạn sẽ thấy SO sử dụng & trong thuộc tính href. –

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