Nếu đây là một dự án kế thừa được mã hóa theo cách này thì mặc dù không phải là tối ưu, tôi hiện không biết bất kỳ cách nào mà nó có thể dễ bị tiêm SQL miễn là mọi chuỗi được xử lý theo cách đó và các truy vấn chỉ đơn giản những cái như bạn đã hiển thị.
Tuy nhiên, tôi không thể nói chắc chắn hơn điều đó. Nếu không sử dụng các truy vấn tham số, luôn có khả năng có một lỗ hổng bảo mật nào đó mà bạn chưa xem xét.
Tự thoát khỏi các trích dẫn theo cách thủ công rất dễ xảy ra lỗi và đôi khi có thể thất bại theo những cách khó lường trước. Ví dụ với bảng sau
CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')
Và thủ tục được lưu trữ bằng cách sử dụng SQL động được xây dựng với nối chuỗi
CREATE PROC UpdateMyTable
@newtitle NVARCHAR(100)
AS
/*
Double up any single quotes
*/
SET @newtitle = REPLACE(@newtitle, '''','''''')
DECLARE @UpdateStatement VARCHAR(MAX)
SET @UpdateStatement = 'UPDATE myTable SET title=''' + @newtitle + ''''
EXEC(@UpdateStatement)
Bạn có thể thử cách sau
Cập nhật bình thường
EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/
Nỗ lực đưa vào SQL bị phá vỡ
EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable /*Returns "';DROP TABLE myTable--"*/
Nỗ lực SQL Injection thành công và bỏ bảng
EXEC UpdateMyTable N'ʼ;DROP TABLE myTable--'
SELECT * FROM myTable /*Returns "Invalid object name 'myTable'."*/
Vấn đề ở đây là truy vấn thứ ba chuyển U + 02BC thay vì dấu nháy đơn chuẩn và sau đó chuỗi được gán cho varchar(max)
sau khi quá trình vệ sinh xảy ra, điều này sẽ âm thầm chuyển điều này thành một dấu nháy đơn thường xuyên.
Cho đến khi tôi đọc câu trả lời ở đây vấn đề đó sẽ không bao giờ xảy ra với tôi.