oracle क्या - NEXT_DAY फ़ंक्शन SQL बनाम पीएल / एसक्यूएल में अलग तरीके से काम करता है?




पल सकल (3)

यह SQL क्वेरी क्यों काम करती है:

SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;
NEXT_DAY(SYSDATE,7)
-------------------
01-APR-17          
1 row selected.

... लेकिन पीएल / एसक्यूएल का यह गुमनाम ब्लॉक काम नहीं करता है?

DECLARE
  dteExpires DATE;
BEGIN
  dteExpires := NEXT_DAY(SYSDATE, 7);
END;
Error at line 1
ORA-01846: not a valid day of the week
ORA-06512: at line 4

मैं हार्ड कोड को एक दिन के पूर्व अंग्रेजी नाम के दूसरे पैरामीटर नहीं करना चाहता। NEXT_DAY(SYSDATE, 'SATURDAY') या NEXT_DAY(SYSDATE, 'SUNDAY') आदि

अभी के लिए, मैं निम्नलिखित काम का उपयोग करेगा, लेकिन मैं सचमुच जानना NEXT_DAY() कि NEXT_DAY() तुलना में पीएल / NEXT_DAY() में अलग तरह से व्यवहार क्यों करता है

DECLARE
  dteExpires DATE;
BEGIN
  -- 2017-01-01 = SUNDAY
  dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 'DAY'));
END;

यह मेरा देव पर्यावरण है:

SELECT *
FROM v$version;
BANNER                                                                

-------------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production                 
CORE  12.1.0.2.0  Production                                            
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production               
NLSRTL Version 12.1.0.2.0 - Production                                

5 rows selected.

Answers

यदि आप NEXT_DAY के एसक्यूएल संस्करण के लिए दस्तावेज़ीकरण की जांच करते हैं, तो आपको पता चल जाएगा कि सप्ताह के किसी दिन का प्रतिनिधित्व करने के लिए किसी संख्या में पास करना बिना दस्तावेज है। यह किसी भी कारण से काम करता है, लेकिन अगर आप इसे काम पर निर्भर करते हैं, तो आप जोखिम ले रहे हैं कि भविष्य में ओरेकल कार्यान्वयन को इस फ़ंक्शन के बताए विनिर्देश के अनुरूप बदल देगा। (जोखिम छोटा है, क्योंकि ओरेकल पागल नहीं है।)

https://docs.oracle.com/database/121/SQLRF/functions118.htm#SQLRF00672

पीएल / एसक्यूएल कार्यान्वयन केवल दस्तावेज विनिर्देश के साथ काम करता है - यह सप्ताह के एक दिन को प्रतिनिधित्व करने के लिए एक संख्यात्मक इनपुट को स्वीकार नहीं करता है।

मुझे लगता है कि यह एक अप्रत्यक्ष उत्तर है। मेरा मानना ​​है कि आप गलत सवाल पूछ रहे हैं प्रश्न "पीएल / एसक्यूएल में यह काम क्यों नहीं करता" नहीं होना चाहिए; बल्कि, दस्तावेज़ीकरण दिए जाने पर प्रश्न "ओरेकल एसक्यूएल में क्यों काम करता है" होना चाहिए। केवल ओरेकल इसका जवाब दे सकता है

आपको OTN पर यह चर्चा उपयोगी पायी जा सकती है: https://community.oracle.com/thread/4023654

और शायद यह भी: https://community.oracle.com/ideas/17257?tab=comment


मुझे लगता है कि मौजूदा सत्र NLS_DATE_LANGUAGE से फ़ंक्शन NEXT_DAY स्वतंत्र बनाने का एकमात्र तरीका आईएसओ सप्ताह के साथ काम करना है जहां सप्ताह के पहले दिन हमेशा सोमवार होता है:

SELECT NEXT_DAY(SYSDATE, TO_CHAR(TRUNC(SYSDATE, 'IW')+5, 'Day')) 
from dual;

TRUNC(SYSDATE, 'IW')+5 अर्थ है "अगले शनिवार"


कई उपयोगी उत्तरों के बारे में, मुझे उम्मीद है कि इस धागे में कुछ मूल्य जोड़े जाएंगे। एसक्यूएल इंजेक्शन एक ऐसा हमला है जो उपयोगकर्ता इनपुट (उपयोगकर्ता द्वारा भरने वाले इनपुट और फिर प्रश्नों के अंदर उपयोग किए जाने वाले इनपुट) के माध्यम से किया जा सकता है, एसक्यूएल इंजेक्शन पैटर्न सही क्वेरी सिंटैक्स हैं, जबकि हम इसे कॉल कर सकते हैं: बुरे कारणों से खराब प्रश्न, हम मानते हैं कि वहां हो सकता है बुरे व्यक्ति बनें जो गुप्त जानकारी (पहुंच नियंत्रण को छोड़कर) प्राप्त करने का प्रयास करते हैं जो सुरक्षा के तीन सिद्धांतों (गोपनीयता, ईमानदारी, उपलब्धता) को प्रभावित करते हैं।

अब, हमारा मुद्दा एसक्यूएल इंजेक्शन हमलों जैसे सुरक्षा खतरों को रोकने के लिए है (प्रश्न पूछने (PHP का उपयोग कर एसक्यूएल इंजेक्शन हमले को कैसे रोकें), अधिक यथार्थवादी, डेटा फ़िल्टरिंग या समाशोधन इनपुट डेटा ऐसे मामले में उपयोगकर्ता इनपुट डेटा का उपयोग करते समय मामला है प्रश्न, PHP या किसी अन्य प्रोग्रामिंग भाषा का उपयोग करना मामला नहीं है, या जैसा कि अधिक लोगों द्वारा तैयार किए गए कथन या वर्तमान में एसक्यूएल इंजेक्शन रोकथाम का समर्थन करने वाले किसी भी अन्य उपकरण का उपयोग करने के लिए अनुशंसित किया गया है, मान लें कि ये उपकरण अब उपलब्ध नहीं हैं? आप अपना आवेदन कैसे सुरक्षित करते हैं?

एसक्यूएल इंजेक्शन के खिलाफ मेरा दृष्टिकोण है: इसे डेटाबेस में भेजने से पहले उपयोगकर्ता इनपुट डेटा को साफ़ करना (किसी भी क्वेरी के अंदर इसका उपयोग करने से पहले)।

डेटा फ़िल्टरिंग (असुरक्षित डेटा को सुरक्षित डेटा में कनवर्ट करना) इस बात पर विचार करें कि PDO और MySQLi उपलब्ध नहीं हैं, आप अपना आवेदन कैसे सुरक्षित कर सकते हैं? क्या आप मुझे उनका उपयोग करने के लिए मजबूर करते हैं? PHP के अलावा अन्य भाषाओं के बारे में क्या? मैं सामान्य विचार प्रदान करना पसंद करता हूं क्योंकि यह विशिष्ट सीमा के लिए व्यापक सीमा के लिए उपयोग नहीं किया जा सकता है।

  1. एसक्यूएल उपयोगकर्ता (उपयोगकर्ता विशेषाधिकार सीमित): सबसे आम एसक्यूएल ऑपरेशंस (चयन, अद्यतन, INSERT) हैं, फिर, उस उपयोगकर्ता को अद्यतन विशेषाधिकार क्यों देना है जिसके लिए इसकी आवश्यकता नहीं है? उदाहरण के लिए लॉगिन, और खोज पृष्ठ केवल चयन का उपयोग कर रहे हैं, फिर, इन पृष्ठों में उच्च विशेषाधिकारों के साथ डीबी उपयोगकर्ताओं का उपयोग क्यों करें? नियम: सभी एसक्यूएल संचालन के लिए सभी विशेषाधिकारों के लिए एक डेटाबेस उपयोगकर्ता न बनाएं, आप आसानी से उपयोग के लिए उपयोगकर्ता नाम के रूप में अपनी योजना (डील्यूसर, चयनकर्ता, अद्यतनकर्ता) बना सकते हैं।

कम से कम विशेषाधिकार के सिद्धांत देखें

  1. डेटा फ़िल्टरिंग: किसी भी क्वेरी के निर्माण से पहले उपयोगकर्ता इनपुट को प्रोग्रामर के लिए मान्य और फ़िल्टर किया जाना चाहिए, प्रत्येक उपयोगकर्ता-इनपुट चर के लिए कुछ गुणों को परिभाषित करना महत्वपूर्ण है: डेटा प्रकार, डेटा पैटर्न और डेटा लंबाई । एक फ़ील्ड जो कि (x और y) के बीच एक संख्या है, एक स्ट्रिंग (टेक्स्ट) वाले फ़ील्ड के लिए सटीक नियम का उपयोग करके सटीक रूप से मान्य होना चाहिए: उदाहरण केस है, उदाहरण के लिए, उपयोगकर्ता नाम में केवल कुछ वर्ण होने चाहिए, [a- zA-Z0-9_-।] लंबाई (x और n) के बीच भिन्न होती है जहां x और n (integers, x <= n)। नियम: सटीक फ़िल्टर और सत्यापन नियम बनाना मेरे लिए सबसे अच्छा अभ्यास है।

  2. अन्य टूल्स का उपयोग करें: यहां, मैं आपसे सहमत हूं कि तैयार कथन (पैरामीट्रिज्ड क्वेरी) और संग्रहीत प्रक्रियाएं, यहां के नुकसान इन तरीकों से उन्नत कौशल की आवश्यकता है जो अधिकांश उपयोगकर्ताओं के लिए मौजूद नहीं हैं, मूलभूत विचार यहां SQL क्वेरी के बीच अंतर करना है और डेटा का उपयोग किया जा रहा है, दोनों दृष्टिकोणों का उपयोग असुरक्षित डेटा के साथ भी किया जा सकता है, क्योंकि उपयोगकर्ता-इनपुट डेटा मूल क्वेरी (जैसे कोई भी या x = x) में कुछ भी नहीं जोड़ता है। अधिक जानकारी के लिए, कृपया ओडब्ल्यूएएसपी एसक्यूएल इंजेक्शन रोकथाम धोखा शीट पढ़ें ।

अब, यदि आप एक उन्नत उपयोगकर्ता हैं, तो इस रक्षा का उपयोग अपनी पसंद के अनुसार शुरू करें, लेकिन शुरुआती लोगों के लिए, यदि वे संग्रहीत प्रक्रिया को जल्दी से कार्यान्वित नहीं कर सकते हैं और कथन तैयार कर सकते हैं, तो इनपुट डेटा को जितना संभव हो उतना फ़िल्टर करना बेहतर होगा।

अंत में, मान लें कि उपयोगकर्ता अपना उपयोगकर्ता नाम दर्ज करने के बजाय नीचे इस पाठ को भेजता है:

[1] UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root'

इस इनपुट को किसी भी तैयार कथन और संग्रहित प्रक्रियाओं के बिना जल्दी से चेक किया जा सकता है, लेकिन सुरक्षित पक्ष पर रहने के लिए, उनका उपयोग करके उपयोगकर्ता-डेटा फ़िल्टरिंग और सत्यापन के बाद शुरू होता है।

अंतिम बिंदु अप्रत्याशित व्यवहार का पता लगा रहा है जिसके लिए अधिक प्रयास और जटिलता की आवश्यकता है; सामान्य वेब अनुप्रयोगों के लिए इसकी अनुशंसा नहीं की जाती है। उपरोक्त उपयोगकर्ता इनपुट में अप्रत्याशित व्यवहार चयन, यूनियन, आईएफ, सबस्ट्रिंग, बेंचमार्क, एसएचए, रूट इन शब्दों के एक बार पता चला है, आप इनपुट से बच सकते हैं।

Update1:

एक उपयोगकर्ता ने टिप्पणी की कि यह पोस्ट बेकार है, ठीक है! यहां दिया गया है OWASP.ORG क्या प्रदान किया गया है:

प्राथमिक सुरक्षा:

विकल्प # 1: तैयार वक्तव्यों का उपयोग (पैरामीटरेटेड क्वेरीज़)
विकल्प # 2: संग्रहीत प्रक्रियाओं का उपयोग
विकल्प # 3: सभी उपयोगकर्ता समर्थित इनपुट से बचें

अतिरिक्त सुरक्षा:

भी लागू करें: कम विशेषाधिकार
भी प्रदर्शन करें: व्हाइट सूची इनपुट सत्यापन

जैसा कि आप जानते हैं, किसी लेख पर दावा करना वैध तर्क द्वारा समर्थित होना चाहिए, कम से कम एक संदर्भ! अन्यथा, इसे हमले और बुरे दावे के रूप में माना जाता है!

Update2:

PHP मैनुअल से, PHP: तैयार वक्तव्य - मैनुअल :

भागने और एसक्यूएल इंजेक्शन

बाउंड चर सर्वर से स्वचालित रूप से बच जाएगा। सर्वर निष्पादन से पहले बयान टेम्पलेट में उचित स्थानों पर अपने बच निकले मूल्यों को सम्मिलित करता है। उपयुक्त रूपांतरण बनाने के लिए, बाध्य चर के प्रकार के लिए सर्वर को एक संकेत प्रदान किया जाना चाहिए। अधिक जानकारी के लिए mysqli_stmt_bind_param () फ़ंक्शन देखें।

एसक्यूएल इंजेक्शन को रोकने के लिए सर्वर के भीतर मूल्यों के स्वचालित भागने को कभी-कभी सुरक्षा सुविधा माना जाता है। अगर इनपुट मूल्य सही ढंग से बच निकले हैं तो गैर-तैयार बयान के साथ सुरक्षा की एक ही डिग्री हासिल की जा सकती है।

Update3:

मैंने तैयार बयान का उपयोग करते समय पीडीओ और MySQLi क्वेरी को MySQL सर्वर पर क्वेरी भेजने के लिए परीक्षण मामलों का निर्माण किया:

पीडीओ:

$user = "''1''"; //Malicious keyword
$sql = 'SELECT * FROM awa_user WHERE userame =:username';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':username' => $user));

क्वेरी लॉग:

    189 Query SELECT * FROM awa_user WHERE userame ='\'\'1\'\''
    189 Quit

MySQLi:

$stmt = $mysqli->prepare("SELECT * FROM awa_user WHERE username =?")) {
$stmt->bind_param("s", $user);
$user = "''1''";
$stmt->execute();

क्वेरी लॉग:

    188 Prepare   SELECT * FROM awa_user WHERE username =?
    188 Execute   SELECT * FROM awa_user WHERE username ='\'\'1\'\''
    188 Quit

यह स्पष्ट है कि एक तैयार कथन भी डेटा से बच रहा है, और कुछ नहीं।

जैसा कि उपर्युक्त कथन में भी उल्लेख किया गया है The automatic escaping of values within the server is sometimes considered a security feature to prevent SQL injection. The same degree of security can be achieved with non-prepared statements, if input values are escaped correctly, इसलिए, यह साबित करता है कि intval()क्वेरी सत्यापन भेजने से पहले डेटा सत्यापन को पूर्णांक मानों के लिए एक अच्छा विचार है, इसके अलावा, क्वेरी भेजने से पहले दुर्भावनापूर्ण उपयोगकर्ता डेटा को रोकना सही और मान्य दृष्टिकोण है

कृपया अधिक जानकारी के लिए यह प्रश्न देखें: पीडीओ MySQL को कच्ची क्वेरी भेजता है जबकि माईस्क्ली तैयार क्वेरी भेजता है, दोनों एक ही परिणाम उत्पन्न करते हैं

संदर्भ:

  1. एसक्यूएल इंजेक्शन धोखा शीट
  2. एसक्यूएल इंजेक्षन
  3. सूचना सुरक्षा
  4. सुरक्षा सिद्धांत
  5. डेटा मान्य






sql oracle date plsql oracle12c