لماذا شخص ما استخدام حيث 1=1 و <conditions> في SQL الحدوث ؟

StackOverflow https://stackoverflow.com/questions/242822

  •  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

وأضاف أنه كان الفرق واضح.أن تفعل شيئا مع رؤوس الجدول إعادته في أقرب وقت الشرط الأول أو الجنون ، على أي حال ، لم تسريع الامور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top