Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL इंजेक्शन को रोकने के दौरान उपयोगकर्ता को टेबल नाम और कॉलम नाम पास करने की अनुमति देना

यह है QUOTENAME() हल करने के लिए बनाया गया था। आप अपने कॉलम और टेबल नामों को QUOTENAME() . में पैरामीटर के रूप में पास करते हैं और फिर आप इसके आउटपुट का उपयोग गतिशील sql क्वेरी में अपने डेटाबेस में objecs का प्रतिनिधित्व करने के लिए करते हैं।

//The evil name tries to expliot code like:
//  set @sql = N'CREATE TABLE [' + @tablename + N'] (Foo int)'
var evilName = "someName] (Foo int); Drop table students --";

var query = @"
declare @sql as nvarchar(max)
set @sql = N'CREATE TABLE ' + QUOTENAME(@tablename) + N' (Foo int)'
exec sp_executesql @sql
";
using(var connection = new SqlConnection(ConnectionString))
using(var command = new SqlCommand(query, connection))
{
    command.Parameters.Add("@tablename", SqlDbType.NVarChar, 128).Value = evilName ;
    connection.Open();
    command.ExecuteNonQuery();
}

सर्वर पर निष्पादित की जाने वाली क्वेरी होगी

CREATE TABLE [someName]] (Foo int); Drop table students --] (Foo int)

जो एक मान्य तालिका नाम के साथ एक तालिका बनाता है और मेरी दूसरी तालिका को नहीं छोड़ता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अनुक्रम के आधार पर परिणामों को समूहीकृत करने के लिए SQL क्वेरी

  2. SQL सर्वर त्रुटि:स्ट्रिंग या बाइनरी डेटा को छोटा कर दिया जाएगा

  3. SQL सर्वर डेटाबेस में डेटा खोए बिना सीडीसी सक्षम तालिका से कॉलम कैसे जोड़ें या छोड़ें - SQL सर्वर ट्यूटोरियल

  4. माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 में एक क्वेरी चलाने से पहले कैसे पता चलेगा कि कितनी पंक्तियां प्रभावित होंगी?

  5. SQL सर्वर यूनियन - व्यवहार द्वारा डिफ़ॉल्ट आदेश क्या है