Có, MySQL có thể lưu trữ bất kỳ loại văn bản nào về mặt kỹ thuật một cách an toàn. Có nghĩa là, MySQL sẽ lưu văn bản như cũ và sẽ trả lại nó một lần nữa mà không làm mất bất kỳ dữ liệu nào.
Mysql không có sự khác biệt giữa nội dung của văn bản, vì vậy sẽ không có gì khác biệt nếu đó là mã HTML, CSS, JS hoặc email cuối cùng của bạn bè bạn.
Tuy nhiên, nếu bạn xuất văn bản sau đó, bạn nên lưu ý rằng không có mã chèn không mong muốn nào sau khi bạn lấy dữ liệu từ mysql. Nhưng điều đó thực sự không liên quan đến MySQL.
Để làm cho sql của bạn an toàn hơn, hãy chuyển xử lý cơ sở dữ liệu cho mysql_real_escape_string
hoặc thậm chí sử dụng tốt hơn MySQLi
và / hoặc PDO
và các báo cáo đã chuẩn bị.
Mã của bạn
Mã của bạn có vẻ như bạn đang cố gắng rất nhiều để ngăn chặn điều gì đó, nhưng cuối cùng thì nó lại trở nên vô dụng:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Chuẩn hóa dữ liệu trước khi bạn xử lý nó
Trước hết, bạn nên thay đổi vị trí của séc cho get_magic_quotes_gpc
để chuẩn hóa dữ liệu mà hàm đang hoạt động. Sẽ tốt hơn nữa nếu ứng dụng của bạn không dựa vào nó mà chỉ từ chối hoạt động nếu tùy chọn đó được bật - xem thông tin quan trọng này ở đây về điều đó
nếu bạn quan tâm đến bảo mật.
Nhưng để đảm bảo an toàn cho mã của bạn đã đăng, trước tiên hãy chuẩn hóa giá trị đầu vào cho hàm trước khi xử lý thêm. Điều này được thực hiện bằng cách chuyển séc lên đầu hàm.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
Trong chức năng được sửa đổi này, nội dung trích dẫn ma thuật (mà bạn không nên sử dụng) đã được chuyển lên trên cùng của nó. Điều này đảm bảo rằng bất kể tùy chọn đó được bật hay tắt, dữ liệu sẽ luôn được xử lý giống nhau. Hàm của bạn đã không làm như vậy, nó sẽ tạo ra các kết quả khác nhau cho cùng một dữ liệu được truyền. Vì vậy, điều này đã được khắc phục.
Các vấn đề khác với chức năng của bạn
Ngay cả chức năng có vẻ tốt hơn bây giờ, nó vẫn còn nhiều vấn đề. Ví dụ, không rõ chức năng thực sự làm gì. Nó thực hiện nhiều việc cùng một lúc và một số trong số chúng trái ngược nhau:
- Nó loại bỏ các thẻ HTML là dấu hiệu cho thấy
$data
không nên chứa HTML - Nhưng sau đó bạn chuyển đổi văn bản của
$data
thực sự chứa các thực thể HTML.
Vậy dữ liệu phải là gì? HTML hay không? Nó không giới thiệu thêm bảo mật nếu mọi thứ trở nên không rõ ràng bởi vì điều này sẽ có lợi khi các lỗi xảy ra trong chương trình của bạn và cuối cùng thậm chí vượt qua các biện pháp phòng ngừa bảo mật của bạn.
Vì vậy, bạn chỉ nên vứt bỏ mã và xem xét những điều sau:
- Nếu đầu vào cho ứng dụng của bạn không hợp lệ, đừng lọc nó. Thay vào đó, ngăn chặn việc sử dụng thêm đầu vào không hợp lệ. Vì vậy, bạn cần một hàm để xác thực thông tin đầu vào trước khi sử dụng nó.
- Đừng thay đổi dữ liệu chỉ vì bạn nghĩ điều này có thể làm cho một cái gì đó an toàn hơn. Thay vào đó, hãy thay đổi và mã hóa dữ liệu ở những nơi cần thiết và thích hợp.
- Làm cho ứng dụng của bạn chỉ hoạt động khi tắt các dấu ngoặc kép. Việc dựa vào tính năng này rất không được khuyến khích. Và sau đó, không cần phải kiểm tra tất cả những điều đó trong mã của bạn.
- Để lưu trữ một thứ gì đó an toàn trong cơ sở dữ liệu, hãy thoát khỏi dữ liệu trước khi chỉ sử dụng nó trong truy vấn. Không phải ở một số nơi khác trong ứng dụng của bạn. Hãy sử dụng câu lệnh Chuẩn bị cho việc đó.
- Không cần phải cuộn dữ liệu trước khi bạn đưa nó vào cơ sở dữ liệu nếu nó hợp lệ. Nhưng bạn cần mã hóa nó đúng cách khi xuất nó ra trang web . Và chỉ có một ứng dụng mới biết điều này cần phải được mã hóa theo cách nào. Bạn không biết điều đó khi đưa dữ liệu vào cơ sở dữ liệu.
Vì vậy, nếu bạn muốn làm cho mã của mình an toàn hơn, đây không phải là việc ném một loạt các chức năng lên một số dữ liệu vì bạn nghĩ rằng chúng liên quan đến bảo mật. Làm như vậy, bạn không làm cho phần mềm của mình an toàn hơn nhưng kém an toàn hơn.
- Không bao giờ tin tưởng vào dữ liệu người dùng.
- Đảm bảo dữ liệu ở định dạng bạn cần xử lý trước .
- Sử dụng đúng công cụ cho công việc vào đúng vị trí.
- Không bao giờ sử dụng các công cụ khi đoán. Thay vào đó, hãy trang bị kiến thức, điều đó không chỉ mang lại hiệu quả bảo mật.