यहाँ एक अधिक सुरक्षित विकल्प है:
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';
मैंने क्या बदला?
- हमेशा
dbo
का उपयोग करें वस्तुओं को बनाते/संदर्भित करते समय उपसर्ग। - टेबल और कॉलम नाम
NVARCHAR
हैं और कर सकते हैं 150 वर्णों से अधिक लंबा हो। भविष्य में किसी व्यक्ति द्वारा जोड़ी जा सकने वाली तालिका को समायोजित करने की अनुमति देने के लिए अधिक सुरक्षित है। - जोड़ा गया
SET NOCOUNT ON
नेटवर्क ओवरहेड के खिलाफ एक गार्ड के रूप में और संभावित रूप से क्लाइंट को गलत परिणाम सेट भेजना। @sql
हमेशाNVARCHAR
होना चाहिए ।QUOTENAME
का उपयोग करें एसक्यूएल इंजेक्शन को विफल करने में मदद करने के लिए टेबल या कॉलम जैसे इकाई नामों के आसपास और खराब चुने गए नामों (जैसे कीवर्ड) से बचाव के लिए।- जहां संभव हो उचित पैरामीटर का उपयोग करें (फिर से SQL इंजेक्शन को विफल करने में मदद करने के लिए लेकिन स्ट्रिंग मापदंडों पर सभी प्रकार के सीमांकक से बचने के लिए)।