xem xét Tuyên bố Chuẩn bị
được sử dụng với concat()
như thường lệ.
DROP PROCEDURE if exists myStoredProc101;
DELIMITER $$
CREATE PROCEDURE myStoredProc101
( pSanitized VARCHAR(124)
)
BEGIN
set @mySql:=concat("SELECT DISTINCT ID FROM user where match(name) against ('* *",pSanitized,"* *')");
PREPARE stmt1 FROM @mySql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
$$
DELIMITER ;
Proc được lưu trữ của bạn không có cơ hội hoạt động vì nó thậm chí không sử dụng tham số của bạn. Những gì bạn đã làm là chôn một cái gì đó bên trong một chuỗi theo nghĩa đen. Ngoài ra, varchar (124) hơi kỳ quặc:p
Về thành công duy nhất mà mọi người có được với các câu lệnh chuẩn bị là sử dụng Biến người dùng (với @
) so với các nỗ lực không thành công khi sử dụng Biến cục bộ (từ DECLARE). Vì vậy, điều đó có thể giúp bạn tiết kiệm vài giờ đập đầu trong tương lai.
Từ Trang hướng dẫn PHP Thủ tục được lưu trữ :
Đối với việc gọi proc được lưu trữ từ mysqli
, vui lòng xem Câu trả lời
từ Pablo Tobar. Nó trông không đặc biệt dễ chịu với nhiều biến, nhưng đó dường như là nơi nó đang ở. Cảnh báo Spoiler:sử dụng biến mysql, không phải biến PHP.
Được cho là, Pablo không trả về tập kết quả mà là viết vào OUT
var trong proc được lưu trữ. Có lẽ bạn cần làm những gì anh ấy đã làm cho IN
tham số và gọi multi_query()
, sau đó là store_result()
, sau đó là fetch_all()
(trong ngắn hạn, PHP tham chiếu một trang lên).
Ngoài ra, một cuộc gọi sẽ được thực hiện bởi Palladium tại đây .
Trong cả hai trường hợp, phải thực hiện đúng trường hợp để tránh lỗ hổng đã biết khi truyền SQL Injection chuyển sang các quy trình thủ tục được lưu trữ.