SQL 조항에서 누군가가 1 = 1과 을 사용하는 이유는 무엇입니까?

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 따라서 성능에 영향을 미치지 않아야합니다.

다른 팁

Greg의 답변에 예제 코드를 추가하는 것입니다.

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

조건 수가 가변적 일 때 사용되는 것을 보았습니다.

"및"문자열을 사용하여 조건을 연결할 수 있습니다. 그런 다음 통과하는 조건의 수를 계산하는 대신 재고 SQL 문의 끝에 "Where 1 = 1"을 배치하고 연결된 조건을 던집니다.

기본적으로 조건에 대한 테스트를 수행 한 다음 "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이 왜 사용되는지 모르겠습니다.

사실, 나는 Birt 보고서에 사용 된 이런 종류의 것을 보았습니다. BIRT 런타임으로 전달 된 쿼리는 양식입니다.

select a,b,c from t where a = ?

그리고 '?' 드롭 다운 상자에서 선택한 실제 매개 변수 값으로 런타임에 교체됩니다. 드롭 다운의 선택은 다음과 같습니다.

select distinct a from t
union all
select '*' from sysibm.sysdummy1

가능한 모든 값을 얻을 수 있도록 "*". 사용자가 선택한 경우"*"드롭 다운 상자 (A의 모든 값을 선택해야 함)에서 실행되기 전에 쿼리를 수정해야합니다 (JavaScript).

"?"이후 위치 매개 변수이며 다른 일이 작동하기 위해서는 남아 있어야합니다. JavaScript는 다음과 같이 쿼리를 수정합니다.

select a,b,c from t where ((a = ?) or (1==1))

이는 기본적으로 위치 매개 변수를 제자리에 두면서 WHERE 절의 효과를 제거합니다.

또한 SQL 쿼리를 동적으로 생성하는 동안 Lazy Coders가 사용하는 및 케이스도 보았습니다.

시작하는 쿼리를 동적으로 만들어야한다고 가정합니다. select * from t 그리고 수표 :

  • 이름은 밥입니다. 그리고
  • 급여는> $ 20,000입니다

어떤 사람들은 첫 번째를 추가하여 다음과 함께 다음을 추가 할 것입니다.

select * from t where name = 'Bob' and salary > 20000

게으른 프로그래머 (그리고 반드시 a 나쁜 특성) 추가 조건을 구별하지 않으면 select * from t where 1=1 그리고 그 후에는 절과 조항을 추가하십시오.

select * from t where 1=1 and name = 'Bob' and salary > 20000

데이터베이스에서 물건을 테스트하거나 이중 체크 할 때이 패턴을 유용하게 발견 했으므로 다른 조건을 매우 빠르게 주석 할 수 있습니다.

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 EG에 가입 할 공통 속성이없는 소스 테이블의 모든 값을 사용하여 표준으로 표현 된 대상을 업데이트하려는 문

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

ECT는 모든 수표를 수행 한 쿼리 실행 타운이 동일합니다. WHERE 절 없이도. 나는 구문의 팬이 아닙니다

마찬가지로 술어를 사용합니다 1=1 액세스 계획이 인덱스 스캔을 사용하거나 사용하지 않도록하는 데 사용되는 일반적인 힌트입니다. 이것이 사용되는 이유는 Where 절에서 다중 네스트가 결합 된 쿼리를 사용하는 경우 WHEDE 절에서 많은 사전 대상 쿼리를 사용하는 것입니다. 때때로 모든 인덱스를 사용하더라도 액세스 플랜이 각 테이블을 읽게하여 전체 테이블 스캔입니다. 이것은 DBAS가 DBMS를보다 효율적인 경로를 사용하도록하는 데 사용하는 많은 힌트 중 하나에 불과합니다. 그냥 던지지 마십시오. 항상 작동하지 않기 때문에 쿼리를 분석하려면 DBA가 필요합니다.

나는 일반적으로 사용자가 선택할 수있는 드롭 다운 값이 많은 보고서를 위해 동적 SQL을 구축 할 때 이렇게합니다. 사용자는 각 드롭 다운에서 값을 선택하거나 선택하지 않을 수 있으므로 결국 첫 번째 조항이었던 조건을 파악하는 데 어려움을 겪게됩니다. 그래서 우리는 쿼리를 a where 1=1 결국 그 후의 조항이있는 곳을 추가하십시오.

같은 것

select column1, column2 from my table where 1=1 {name} {age};

그런 다음 이와 같은 위치 절을 빌드하고 매개 변수 값으로 전달합니다.

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

런타임에 Where 절을 선택하지 않으므로이를 통해 포함할지 여부를 찾는 데 큰 도움이됩니다. 'AND' or 'WHERE'.

나는 처음으로 Ado와 Classic ASP로 이것을 다시 만났다. 성능.당신이 똑바로하는 경우

Select * from tablename

SQL 명령/텍스트로 전달하십시오.

Where 1=1

또한, 그것은 눈에 띄는 차이라고 덧붙였다. 첫 번째 조건이 충족 되 자마자 테이블 헤더가 반환되는 것과 관련이 있거나 어쨌든 속도가 빨라졌습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top