2012-06-20 32 views
5

một chút của một newbie PHP/MySQL ở đây ...PHP/MySQL - Ký tự an toàn cho tên hiển thị/tên người dùng/mật khẩu, với PDO

Tôi đã xây dựng một trang web dựa trên PHP sử dụng cơ sở dữ liệu MySQL để lưu trữ thông tin người dùng, như tên hiển thị, tên người dùng và mật khẩu của họ.

Tôi đã tìm hiểu về thoát, các câu lệnh đã chuẩn bị và các loại tương tự, và cách ngăn chặn việc tiêm SQL như "bobby"); người dùng bảng thả-- ".

Tôi đang sử dụng các câu lệnh chuẩn bị PDO để nhận dữ liệu nhập của người dùng từ biểu mẫu, để đăng ký chúng vào DB. Tuy nhiên, tôi cần phải biết một vài điều:

  1. Kể từ khi tôi đang sử dụng chuẩn bị phát biểu, cho tên hiển thị, tên người dùng, mật khẩu, vv, là nó okay cho tôi để cho phép ký tự đặc biệt như @, #, $, hoặc thậm chí là dấu ngoặc kép 'đơn' hoặc "gấp đôi"? Và còn khoảng trắng, ký tự quốc tế, ký tự có dấu trọng âm hoặc những thứ như ♥ ? Và khi tôi hỏi rằng "okay" có cho phép các ký tự này không, tôi có thể tự hỏi nếu có thêm bất kỳ rủi ro bảo mật nào có thể phát sinh không cho phép dấu ngoặc kép hoặc dấu ngoặc đơn trong tên người dùng hoặc số như thẻ html cho chữ in đậm hoặc in nghiêng?

  2. Nếu nó không quan trọng để cho phép nhất ký tự đặc biệt, nhưng không phải một số: là có bất kỳ cụ thể nhân vật "nguy hiểm" (trong phạm vi của MySQL) mà tôi hoàn toàn cần phải thực hiện bất hợp pháp? (Tôi cảm thấy như dấu ngoặc kép có thể phù hợp chương trình nghị sự này, nhưng tôi nhận được tín hiệu hỗn hợp về điều đó.)

  3. Nếu tôi được phép ký tự bên ngoài các điển hình "chữ và nhấn" phạm vi, là có bất kỳ cạm bẫy tôi có thể trải nghiệm sau (trong MySQL, SQL hoặc PHP) để cho phép các ký tự lạ? Tôi có cần bằng cách nào đó để làm cho thẻ html xuất hiện dưới dạng chuỗi, thay vì thẻ thực tế , khi hiển thị tên người dùng của mọi người? Hoặc tôi có cần phải thoát khỏi các báo giá trong tên người dùng bất cứ khi nào tôi muốn truy vấn với họ không? Hoặc không có vấn đề gì kể từ khi tôi sẽ sử dụng báo cáo đã chuẩn bị với PDO?

  4. Do bảng mã như utf8 hoặc UTF16 đến ở bất cứ nơi nào, trong việc đưa ra nó vì vậy tôi có thể chấp nhận phạm vi rộng nhất của tên hiển thị và tên người dùng, trong khi vẫn đảm bảo những bảng chữ cái có thể được trả lại trên trang web của tôi?

  5. Tôi biết rằng có một số chữ cái Cyrillic trông giống hệt với các chữ cái tiếng Anh . Tôi sử dụng để sao chép trực tiếp từ MS Word và sử dụng chúng trong tên người dùng của tôi. Tôi nhận thấy rằng những điều này có thể được sử dụng để giả mạo mạo danh các thành viên khác, chỉ bằng cách hoán đổi một chữ "a" cho một chữ "a" bằng chữ Kirin. Tên người dùng với ♥ trong họ có thể khó khăn để tìm kiếm xem có ai đó không thông thạo mã alt hay không. Nên này có phải là mối lo ngại không? Ý kiến ​​của bạn như thế nào?

Cảm ơn trước bất kỳ ai có thể cho tôi một số thông tin chi tiết về điều này.

+0

Hãy giới hạn bài đăng của bạn cho một câu hỏi tại một thời điểm –

Trả lời

2

Trước tiên hãy để tôi nói rằng tôi thực sự thích phong cách của bạn. Dường như hầu hết mọi người không dành thời gian để suy nghĩ những điều này thông qua, và chỉ tát cùng các truy vấn mà không làm sạch dữ liệu nào cả. Vì vậy, xin chúc mừng được siêng năng. :)

Điều đó nói rằng, với PDO, bạn không cần phải lo lắng về báo giá làm rối loạn truy vấn của mình. Đặc biệt nếu bạn liên kết các biến của mình với bindParam, cho phép kiểm soát thông số nghiêm ngặt. Với điều đó, bạn có thể truyền loại biến và độ dài. Ngoài ra, các ký tự đặc biệt sẽ không làm hỏng truy vấn của bạn, vì PDO cũng thoát được chúng. Vì vậy, không cần phải lo lắng về điều đó.

Để làm cho HTML xuất hiện dưới dạng văn bản thay vì HTML thực tế, một hàm rất hữu ích là htmlspecialchars(), sẽ chuyển đổi mã html thành mã ký tự. Chức năng này cũng có thể được sử dụng với cờ ENT_QUOTES tùy chọn, biến này " thành số " này. htmlspecialchars() cũng có một tùy chọn để thiết lập đầu ra cho mã hóa của sự lựa chọn của bạn.

+0

nhưng cũng có thể, chỉ tin tưởng 'htmlspecialchars' cũng có thể nguy hiểm: http://blog.astrumfutura.com/2012/03/a-hitchhikers-guide-to-cross -site-scripting-xss-in-php-part-1-cách-không-để-sử dụng-htmlspecialchars-cho-output-escape/ –

+0

Cảm ơn; điều này trả lời câu hỏi "tổng thể" của tôi khá tốt. :) – Jackson

4

SQL Injection Cheat Sheet có một số ví dụ về truy vấn MySQL mà bạn có thể kiểm tra trong khi vẫn đang phát triển.

Đây là tài nguyên tuyệt vời để tìm hiểu về một số câu hỏi của bạn về "Được chấp nhận" và bạn phải xem xét toàn bộ vòng đời của "một đoạn dữ liệu".

Điển hình là một phần dữ liệu có thể bắt đầu trong một hình thức HTML và sau đó nhận được văn để kịch bản PHP của bạn (như vậy, nếu người dùng muốn họ có thể chỉ dữ liệu POST trực tiếp mà không theo mẫu). Sau đó, tập lệnh php của bạn (hy vọng) khử trùng dữ liệu, sau đó là Đã lưu.

Trong thời gian ở cơ sở dữ liệu, bạn có thể làm sao lưu hoạt động, lưu nó vào một SQLDump, hoặc một số loại khác của bảo trì.

Sau đó, rõ ràng là các dữ liệu sẽ được đọc tại một số điểm, nếu đó là một ngôn ngữ markdown nó có thể bị biên soạn, và cuối cùng nó được gửi tới trình duyệt của một ai đó, nơi nó có thể là tiêm vào htmlhiển thị.

Như bạn có thể thấy có rất nhiều địa điểm trong một vòng đời của dữ liệu nơi mọi thứ có thể bị xáo trộn. Nếu bạn không xem xét tất cả những lỗi này, bạn có thể thấy một số lỗi phổ biến như các dấu gạch chéo ngược chồng lên bản thân mỗi khi bạn lưu/tải dữ liệu .. lỗi sql, trở nên dễ bị tấn công, v.v.

Loại dữ liệu nào bạn có muốn hỗ trợ không? Tùy ban. Chỉ cần chắc chắn rằng bạn muốn xử lý nó một cách chính xác.

+0

Cảm ơn bạn đã liên kết; mặc dù trang đó trông đáng sợ, nó cũng trông giống như một tài nguyên bảo mật hữu ích cho dự án của tôi. Tôi cũng đánh giá cao tổng quan về vòng đời dữ liệu; mang lại cho tôi một ý tưởng ít mơ hồ về "bức tranh lớn", như tôi (khá lỏng lẻo) hiện đang hiểu nó: P – Jackson

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