Đây là một giải pháp thay thế an toàn hơn nhiều:
ALTER PROCEDURE dbo.queryfunctions
@Tabname NVARCHAR(511),
@colname NVARCHAR(128),
@valuesname VARCHAR(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @Tabname
+ ' WHERE ' + QUOTENAME(@colname) + ' = @v';
EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
END
GO
EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';
Tôi đã thay đổi điều gì?
- Luôn sử dụng
dbo
tiền tố khi tạo / tham chiếu đối tượng. - Tên bảng và cột là
NVARCHAR
và can dài hơn 150 ký tự. An toàn hơn nhiều khi cho phép các tham số phù hợp với một bảng mà ai đó có thể thêm vào trong tương lai. - Đã thêm
SET NOCOUNT ON
như một biện pháp bảo vệ chống lại chi phí mạng và có khả năng gửi các tập hợp kết quả sai cho khách hàng. -
@sql
phải luôn làNVARCHAR
. - Sử dụng
QUOTENAME
xung quanh tên thực thể chẳng hạn như bảng hoặc cột để ngăn chặn việc đưa vào SQL và cũng để bảo vệ khỏi những tên được chọn kém (ví dụ:từ khóa). - Sử dụng các tham số thích hợp nếu có thể (một lần nữa để giúp ngăn chặn việc đưa vào SQL nhưng cũng để tránh phải thực hiện tất cả các loại thoát dấu phân cách trên các tham số chuỗi).