Hướng dẫn mysqli real escape string bypass - bỏ qua chuỗi thoát thực mysqli
Đây là một trường hợp khác, (có lẽ ít hơn?)Để tôn kính câu trả lời tuyệt vời của @ircmaxell (thực sự, điều này được cho là tâng bốc và không đạo văn!), Tôi sẽ áp dụng định dạng của anh ấy: Cuộc tấn côngBắt đầu với một cuộc biểu tình ...
Điều này sẽ trả về tất cả các hồ sơ từ bảng 6. Một sự mổ xẻ:
Như người bạn đã học của tôi đã đặt nó: Xin chúc mừng, bạn đã tấn công thành công một chương trình bằng cách sử dụng ____ 13 ... Những người xấu 2 không thể giúp đỡ, vì điều này không liên quan gì đến các bộ ký tự; 3 cũng không thể, vì đó chỉ là một trình bao bọc khác xung quanh cùng chức năng này.Vấn đề, nếu chưa rõ ràng, đó là lời kêu gọi 3 không thể biết nhân vật nào theo nghĩa đen sẽ được trích dẫn, vì điều đó còn lại cho nhà phát triển để quyết định sau đó. Vì vậy, trong chế độ 4, thực sự không có cách nào mà chức năng này có thể thoát khỏi mọi đầu vào một cách an toàn để sử dụng với trích dẫn tùy ý (ít nhất, không phải không nhân đôi các ký tự không yêu cầu nhân đôi và do đó thu thập dữ liệu của bạn).cannot know with which character the literal will be quoted, as that's left to the developer to decide at a later time. So, in 4 mode, there is literally no way that this
function can safely escape every input for use with arbitrary quoting (at least, not without doubling characters that do not require doubling and thus munging your data).Xấu xíNó trở nên tồi tệ hơn. 4 có thể không phải là tất cả những điều không phổ biến trong tự nhiên do sự cần thiết của việc sử dụng nó để tương thích với SQL tiêu chuẩn (ví dụ: xem Phần 5.3 của đặc tả SQL-92, cụ thể là sản xuất ngữ pháp 7 và thiếu bất kỳ ý nghĩa đặc biệt nào được đưa ra cho BackSlash). Hơn nữa, việc sử dụng nó được khuyến nghị rõ ràng như là một cách giải quyết cho lỗi (từ lâu đã cố định) mà bài đăng của IRCMaxell mô tả. Ai biết được, một số DBA thậm chí có thể định cấu hình nó theo mặc định là phương tiện không khuyến khích sử dụng các phương pháp thoát không chính xác như 8.Ngoài ra, chế độ SQL của kết nối mới được máy chủ đặt theo cấu hình của nó (mà người dùng 9 có thể thay đổi bất cứ lúc nào); Do đó, để chắc chắn về hành vi của máy chủ, bạn phải luôn chỉ định rõ ràng chế độ mong muốn sau khi kết nối.Ân sủng cứu rỗiMiễn là bạn luôn đặt chế độ SQL một cách rõ ràng để không bao gồm 4 hoặc trích dẫn các chữ cái MySQL bằng cách sử dụng ký tự một đoạn, lỗi này không thể nuôi lặp lại sẽ đúng.Vì lý do này, tôi khuyên mọi người nên sử dụng 4 cũng cho phép chế độ 3, vì nó sẽ buộc sử dụng theo thói quen các chuỗi chữ được trích xuất đơn. Lưu ý rằng điều này không ngăn được tiêm SQL trong trường hợp các chữ được trích dẫn kép xảy ra được sử dụng, nó chỉ làm giảm khả năng xảy ra điều đó (vì các truy vấn không độc hại bình thường sẽ thất bại).Trong PDO, cả chức năng tương đương của nó 4 và trình giả lập câu lệnh đã chuẩn bị của nó khi ____ 55, điều này chính xác: nó đảm bảo rằng nghĩa đen thoát ra được trích dẫn trong các trích dẫn đơn, vì vậy bạn có thể chắc chắn rằng PDO luôn miễn dịch với lỗi này.Kể từ MySQL v5.7.6, lỗi này đã được sửa. Xem Nhật ký thay đổi:
Ví dụ an toànĐược thực hiện cùng với lỗi được giải thích bởi IRCMaxell, các ví dụ sau hoàn toàn an toàn (giả sử rằng một lỗi sử dụng MySQL muộn hơn 4.1.20, 5.0.22, 5.1.11; hoặc một người không sử dụng mã hóa kết nối GBK/BIG5) :
... Bởi vì chúng tôi đã chọn rõ ràng một chế độ SQL không bao gồm 4.
... Bởi vì chúng tôi đang trích dẫn chuỗi theo nghĩa đen của chúng tôi với các trích dẫn đơn. 0... Bởi vì các câu lệnh được chuẩn bị PDO miễn nhiễm với lỗ hổng này (và IRCMaxell cũng vậy, với điều kiện là bạn đang sử dụng PHP≥5.3.6 và bộ ký tự đã được đặt chính xác trong DSN; hoặc mô phỏng câu lệnh đã chuẩn bị đã bị vô hiệu hóa) . 1... Bởi vì chức năng 6 của PDO không chỉ thoát khỏi nghĩa đen, mà còn trích dẫn nó (trong các ký tự 7 đơn lẻ); Lưu ý rằng để tránh lỗi của IRCMaxell trong trường hợp này, bạn phải sử dụng PHP≥5.3.6 và đã đặt chính xác ký tự được đặt trong DSN. 2... Bởi vì các tuyên bố chuẩn bị MySQLI là an toàn. Gói lênVì vậy, nếu bạn:
HOẶC
HOẶC
một chế độ SQL được đặt rõ ràng không bao gồm 4
Chuỗi Escape thực của MySQLI làm gì?Định nghĩa và sử dụng real_escape_string () / mysqli_real_escape_string () Hàm thoát khỏi các ký tự đặc biệt trong một chuỗi để sử dụng trong truy vấn SQL, có tính đến bộ ký tự hiện tại của kết nối.escapes special characters in a string for use in an SQL query, taking into account the current character set of the connection.
MySQL_REAL_ESCAPE_STRING có bị phản đối không?Phần mở rộng này đã được không nhận được trong Php 5.5.0 và nó đã bị loại bỏ trong Php 7.0. 0, and it was removed in PHP 7.0.
Tôi có cần mysqli_real_escape_string không?Graham gần đây đã hỏi tôi: Tôi vẫn cần sử dụng mysqli_real_escape_string khi được sử dụng các câu lệnh được chuẩn bị trong PHP?Câu trả lời đơn giản là không có.Cách nó được sử dụng để hoạt động là bạn sẽ lấy dữ liệu đầu vào hình thức, đưa nó vào một biến và đưa dữ liệu đó vào truy vấn MySQL của bạn để thêm dữ liệu đó vào cơ sở dữ liệu.The simple answer is no. The way it used to work is that you would take form input data, put that into a variable, and inject that data into your MySQL query in order to add that data to the database.
MySQLI_REAL_ESCAPE_STRING có an toàn không?PHP cung cấp MySQL_REAL_ESCAPE_STRING () để thoát các ký tự đặc biệt trong một chuỗi trước khi gửi truy vấn đến MySQL.Chức năng này được nhiều người thông qua để thoát khỏi các trích dẫn đơn trong chuỗi và cùng một dịp ngăn chặn các cuộc tấn công tiêm SQL.Tuy nhiên, nó có thể tạo ra các lỗ hổng bảo mật nghiêm trọng khi nó không được sử dụng chính xác.it can create serious security flaws when it is not used correctly. |