لماذا شخص ما استخدام حيث 1=1 و <conditions> في SQL الحدوث ؟
-
04-07-2019 - |
سؤال
لماذا شخص ما استخدام WHERE 1=1 AND <conditions>
في SQL البند (إما SQL التي تم الحصول عليها من خلال متصلا السلاسل ، إما عرض تعريف)
رأيت في مكان ما أن هذا من شأنه أن تستخدم للحماية من حقن SQL, ولكن يبدو غريب جدا.
إذا كان هناك حقن WHERE 1 = 1 AND injected OR 1=1
سيكون له نفس النتيجة injected OR 1=1
.
في وقت لاحق تحرير:ماذا عن الاستخدام في ضوء التعريف ؟
شكرا لك على إجاباتك.
لا يزال ، أنا لا أفهم لماذا شخص استخدام هذا البناء من أجل تحديد عرض أو استخدامها داخل إجراء مخزن.
خذ هذا على سبيل المثال:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
المحلول
إذا كانت قائمة الشروط غير معروف في وقت الترجمة و بدلا من ذلك يتم بناؤها في وقت التشغيل, كنت لا داعي للقلق حول ما إذا كان لديك واحد أو أكثر من شرط واحد.يمكنك إنشاء كل منهم مثل:
and <condition>
و سلسلة لهم معا.مع 1=1
في بداية الأولية and
لديها ما اقترانه.
لم أر هذا من استخدامها في أي نوع من الحقن الحماية ، كما تقول فإنه لا يبدو مثل ذلك من شأنه أن يساعد كثيرا.أنا لديك رأيت استخدامها بوصفها تنفيذ الراحة.استعلام SQL المحرك سوف ينتهي تجاهل 1=1
لذلك ينبغي أن يكون هناك تأثير الأداء.
نصائح أخرى
فقط إضافة المثال التعليمات البرمجية جريج الجواب:
dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1")
''// From now on you don't have to worry if you must
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if
رأيت أنها تستخدم عند عدد من الشروط يمكن أن تكون متغيرة.
يمكن لسلسلة شروط استخدام " و " سلسلة.ثم بدلا من عد عدد من الشروط أنك تمر في المكان "حيث 1=1" في نهاية الأسهم الخاصة بك SQL ورمي على متسلسلة الظروف.
في الأساس, فإنه يوفر لك الحاجة إلى إجراء اختبار على الشروط ثم قم بإضافة "حيث" سلسلة من قبلهم.
يبدو كسول طريقة تعرف دائما أن جملة WHERE يعرف بالفعل و تسمح لك للحفاظ على إضافة شروط دون الحاجة إلى التحقق إذا كان هذا هو أول واحد.
بشكل غير مباشر ذات الصلة:عندما 1=2 يستخدم:
CREATE TABLE New_table_name
as
select *
FROM Old_table_name
WHERE 1 = 2;
هذا سوف إنشاء جدول جديد مع نفس المخطط حسب الجدول القديم.(مفيد جدا إذا كنت ترغب في تحميل بعض البيانات يقارن)
1 = 1 التعبير يستخدم عادة في إنشاء sql البرمجية.هذا التعبير يمكن تبسيط sql توليد رمز الحد من عدد من العبارات الشرطية.
حيث 1=0, ويتم هذا الاختيار إذا كان الجدول موجودا.لا أعرف لماذا 1=1 يستخدم.
في الواقع ، لقد رأيت هذا النوع من الأشياء المستخدمة في بيرت التقارير.الاستعلام تمريرها إلى بيرت وقت التشغيل هو من شكل:
select a,b,c from t where a = ?
و '?' يتم استبدال في وقت التشغيل عن طريق الفعلي المعلمة القيمة المحددة من مربع القائمة المنسدلة.الخيارات في القائمة المنسدلة تعطى عن طريق:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
بحيث يمكنك الحصول على جميع القيم الممكنة زائد "*
".إذا كان المستخدم يختار "*
"من مربع القائمة المنسدلة (يعني كل القيم يجب أن تكون مختارة), الاستعلام إلى تعديل (عن طريق جافا سكريبت) قبل أن يتم تشغيل.
منذ " ؟ " الموضعية المعلمة يجب أن تبقى هناك أشياء أخرى في العمل ، سكريبت تعديل استعلام:
select a,b,c from t where ((a = ?) or (1==1))
أن الأساس يزيل تأثير جملة where في حين لا يزال يترك الموضعية المعلمة في المكان.
رأيت أيضا في حالة استخدامها من قبل كسول المبرمجون في حين حيوي إنشاء استعلام SQL.
نقول لديك بشكل حيوي إنشاء استعلام الذي يبدأ مع select * from t
و الشيكات:
- اسم بوب ، و
- الراتب > $20,000
بعض الناس إضافة الأول مع حيث اللاحقة منها مع وبالتالي:
select * from t where name = 'Bob' and salary > 20000
كسول المبرمجين (و هذا ليس بالضرورة سيئة سمة) لا يميز بين وأضاف أنهم سوف تبدأ مع select * from t where 1=1
و إضافة بنود بعد ذلك.
select * from t where 1=1 and name = 'Bob' and salary > 20000
لقد وجدت من المفيد هذا النمط عندما أكون اختبار أو doublechecking الأمور على قاعدة البيانات حتى يمكنني التعليق بسرعة شروط أخرى:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1
AND Table.Field=Value
AND Table.IsValid=true
يتحول إلى:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1
--AND Table.Field=Value
--AND Table.IsValid=true
في حين أرى أن 1=1 سيكون من المفيد إنشاء SQL, تقنية تستخدم في PHP هو خلق مجموعة من الشروط ومن ثم القيام
implode (" AND ", $clauses);
وبالتالي تجنب مشكلة وجود قيادة أو زائدة،.ومن الواضح أن هذا هو مفيد فقط إذا كنت تعرف أن كنت تسير على أن يكون واحد على الأقل شرط!
وهنا ارتباطا وثيقا سبيل المثال:باستخدام SQL MERGE
بيان التحديث الهدف طرح باستخدام جميع القيم من الجدول المصدر حيث لا يوجد مشترك السمة التي للانضمام على مثل
MERGE INTO Circles
USING
(
SELECT pi
FROM Constants
) AS SourceTable
ON 1 = 1
WHEN MATCHED THEN
UPDATE
SET circumference = 2 * SourceTable.pi * radius;
لماذا شخص ما استخدام حيث 1=1 و
<proper conditions>
لقد رأيت صوفي الأطر تفعل مثل هذه الاشياء (أحمر الخدود) ، كما يسمح هذا كسول تحليل الممارسات التي تطبق على كل من WHERE
و AND
Sql الكلمات الرئيسية.
على سبيل المثال (أنا باستخدام C# كمثال هنا) ، النظر في المشروط تحليل التالية المسندات في استعلام Sql string builder
:
var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
sqlQuery = sqlQuery + " AND Baz < 12";
}
و "الاستفادة" من WHERE 1 = 1
ما يعني أنه لا يوجد رمز خاص هو مطلوب:
- بالنسبة و - إذا كان صفر واحد أو كل من المسندات (الحانات باز) ينبغي أن تطبق ، والتي من شأنها تحديد ما إذا كان أول
AND
هو مطلوب.لأن لدينا بالفعل واحدة على الأقل المسند مع1 = 1
, يعنيAND
هو دائما بخير - لا المسندات في كل شيء - في الحالة التي يكون فيها هناك صفر المسندات ، ثم
WHERE
يجب أن يكون إسقاط.ولكن مرة أخرى, نحن يمكن أن يكون كسول ، لأننا مرة أخرى ضمان واحد على الأقل المسند.
ومن الواضح أن هذا هو فكرة سيئة وسوف نوصي باستخدام أنشأت الوصول إلى البيانات أو الإطار ORM لتحليل اختياري المشروط المسندات في هذا السبيل.
إذا كنت جئت إلى هنا بحثا عن WHERE 1
, لاحظ أن WHERE 1
و WHERE 1=1
متطابقة. WHERE 1
يستخدم نادرا لأن بعض أنظمة قواعد البيانات رفض ذلك معتبرا WHERE 1
لا يجري منطقية.
وهذا مفيد في حالة حيث لديك لاستخدام الاستعلام الحيوي في التي في شرط عليك أن إلحاق بعض خيارات التصفية.مثل إذا كنت تشمل خيارات 0 حالة غير نشطة ، 1 ل نشطة.على أساس من الخيارات هناك اثنين فقط من الخيارات المتاحة(0 و 1) ولكن إذا كنت ترغب في عرض كافة السجلات ، وهو مفيد أن تدرج في مكان قريب 1=1.انظر أدناه عينة:
Declare @SearchValue varchar(8)
Declare @SQLQuery varchar(max) = '
Select [FirstName]
,[LastName]
,[MiddleName]
,[BirthDate]
,Case
when [Status] = 0 then ''Inactive''
when [Status] = 1 then ''Active''
end as [Status]'
Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
Set @SearchOption = ' Where a.[Status] = 1'
End
If (@SearchValue = 'Inactive')
Begin
Set @SearchOption = ' Where a.[Status] = 0'
End
If (@SearchValue = 'All')
Begin
Set @SearchOption = ' Where 1=1'
End
Set @SQLQuery = @SQLQuery + @SearchOption
Exec(@SQLQuery);
بعد استعراض كل الإجابات قررت إجراء بعض التجارب مثل
SELECT
*
FROM MyTable
WHERE 1=1
ثم راجعت مع أرقام أخرى
WHERE 2=2
WHERE 10=10
WHERE 99=99
إلخ بعد أن فعل كل الشيكات الاستعلام تشغيل المدينة هو نفسه.حتى من دون جملة where.أنا لست مروحة من جملة
باستخدام المسند مثل 1=1
هو تلميح العادي في بعض الأحيان بالقوة الوصول تخطط لاستخدام أو عدم استخدام مؤشر المسح الضوئي.السبب يستخدم هذا هو عندما كنت تستخدم متعددة متداخلة انضم الاستعلام مع العديد من المسندات في جملة where حيث في بعض الأحيان حتى باستخدام كافة الفهارس يسبب خطة الوصول إلى قراءة كل جدول - الجدول الكامل الفحص.هذا هو 1 من العديد من التلميحات التي يستخدمها دباس خدعة dbms إلى استخدام أكثر كفاءة الطريق.فقط لا رمي واحد ؛ تحتاج ديسيبل لتحليل الاستعلام لأنه لا يعمل دائما.
أنا أفعل هذا عادة عندما أكون في بناء SQL ديناميكية التقرير الذي لديه العديد من قيم المنسدلة يمكن للمستخدم تحديد.لأن المستخدم قد أو قد لا اختيار القيم من كل المنسدلة, نحن في نهاية المطاف الحصول على الوقت الصعب معرفة أي حالة كانت أول جملة where.لذلك نحن الوسادة الاستعلام مع where 1=1
في النهاية وإضافة كافة حيث الأحكام بعد ذلك.
شيء مثل
select column1, column2 from my table where 1=1 {name} {age};
ثم نود أن بناء جملة where مثل هذا وتمريرها كما المعلمة القيمة
string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";
كما where مجموعة غير معروفة لنا في وقت التشغيل ، لذلك هذا يساعدنا كثيرا في العثور على ما إذا كان لتشمل 'AND' or 'WHERE'.
صادفت هذه العودة مع ADO و asp الكلاسيكية, كان الجواب حصلت: الأداء. إذا كنت تفعل مباشرة
Select * from tablename
وتمرير ذلك في أمر sql/النص سوف تحصل على أداء ملحوظا مع زيادة
Where 1=1
وأضاف أنه كان الفرق واضح.أن تفعل شيئا مع رؤوس الجدول إعادته في أقرب وقت الشرط الأول أو الجنون ، على أي حال ، لم تسريع الامور.