또는 어떻게 사용자 데이터를 보호하기 위해서는 SQL Injection

감사

재미있는 사실

SQL injection 주변되었습니다 꽤 많은 이후 웹사이트에 저장된 데이터에서 데이터베이스가 있습니다.

개방형 웹 애플리케이션 보안 프로젝트는 2017 년 웹 애플리케이션이 직면 한 상위 10 개 위협 중 하나로 주입 공격을 평가했습니다.,

SQL 주입은 여전히 많은 대용량 데이터 유출을 담당합니다. 2016 년에 일리노이 주와 애리조나 주 선거위원회 유권자 등록 데이터베이스가 위반되었습니다. 는 동안 어떠한 정보에 도난당한 애리조나,일리노이에서 공격자에 액세스하는 유권자를 포함하여 데이터 이름,주소,생년월일,성별,부분적 사회보장 번호에 대한 80,000 사람들이다.⁴

그게 무섭다,뭐야?

SQL injection 은 유형의 공격을 대상으로 하는 응용 프로그램의 데이터베이스의 삽입을 통해 의도하지 않은 코드를 사용자 입력 필드가 있습니다., 을 활용하여 SQL 구문에 사용할 수 있습니다 공격자 입력 필드에서 정보를 수집하기 위해 이러한 데이터베이스—다음과 같은 것들을 포함한 비밀번호와 신용 카드 번호입니다. 누군가가 데이터베이스를 제어하거나 보유하고있는 모든 정보를 삭제할 수도 있습니다.

어떻게 작동하나요?

SQL Injection 은 필드에 삽입 된 정보를 사용하여 해당 SQL 문을 조작하여 의도하지 않은 작업을 수행하는 방식으로 작동합니다.,

여기에 기본적인 예이다:

SELECT * FROM customers WHERE name = " + user_name + ";

이 예제에서는 말하자 변수 user_name 이 직접 만든에서는 사용자의 입력 웹사이트에. 해당 문자열이 위의 SQL 문에 삽입되고 해당 사용자 이름과 관련된 모든 필드가 반환됩니다. 별거 아니야.그러나 누군가가 Steve”또는 1=1;—사용자 이름으로 입력하면 어떻게됩니까? 그런 다음 생성 된 SQL 은 다음과 같습니다.

SELECT * FROM customers WHERE name = "Steve" OR 1=1;--";

1=1 이 항상 true 이므로 테이블의 모든 데이터를 반환합니다. 좋지 않다!,

Let’s take one more look at that comic.

xkcd

The son’s name is Robert’); DROP TABLE students; — What would that do exactly?,

라,우리가 추측할 수 있는 경우 조금 바 테이블 추가 학교의 데이터베이스의 학생들,SQL 문 다음과 같습니다.

INSERT INTO students (name) VALUES ('<Student Name>');

…그리고 우리는 삽입한 바 있습니다…

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE students;--');

이후 바비의 이름을 포함); 값을 인수를 폐쇄 중간에서 그의 이름과 텍스트는 다음과 같이 드롭 테이블 학생들은 새로운는 SQL 문을 삭제합니다. 마지막으로-at the end 는 나머지 SQL 을 주석 처리하여 본질적으로 원본 코드의 나머지 부분을 무시하고 오류가 발생하지 않도록합니다.,

그 무엇을 말하는 데이터는 안전하지 않 Again?

아니! 실제로 이런 종류의 공격으로부터 자신을 보호하기 위해 취할 수있는 많은 단계가 있습니다. 몇 가지를 살펴 보겠습니다.

  1. 데이터를 위생 처리합니다. 첫 번째 단계는 사용자가 입력 할 수있는 것을 제어하는 것입니다. 이를 수행하는 가장 좋은 방법은 특정 필드에 허용되는 입력 유형을 제한하는 것입니다., 예를 들어 전화 번호 필드에 당신을 허용 할 수 있다 숫자 입력,또는 이메일의 필드만을 허용할 수 있는 문자에서 발견 유효한 전자 메일 주소입니다. 분명히 일부 필드에는 공격에 사용할 수있는 문자가 필요하므로이 방법은 탁월하지 않습니다.
  2. 오류 보고를 구성합니다. 종종 데이터베이스 관리 시스템에 대한 기본 오류보고에는 개발자 디버깅 정보가 있습니다. 이렇게하면 테이블 이름이나 열 이름과 같이 공격자에게 유용한 정보를 반환 할 수 있습니다., 는 것이 확인이 보이지 않습니다 이 유형의 정보를 외부에 사용할 수 있으므로 이들에게 잠재적인 공격자의 인생이 훨씬 더 편해졌습니다.
  3. 바운드 매개 변수를 사용합니다. 바운드 매개 변수를 사용하면 사용자 데이터를 변수에 저장 한 다음 자리 표시 자로 만든 SQL 문에 삽입 할 수 있습니다. SQL 문과 변수가 별도로 서버로 전송되므로 바운드 매개 변수는 주입으로부터 보호하는 데 능숙합니다. 그 작은 바비 티를 가져 가라!, 예를 들어본 매개변수 업데이트 방법 루비에서는 다음과 같이 보일 것입니다.
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

그것은 미치고 생각하는 무언가가 그렇게 간단하고 잘 이해하는 것도 이렇게 많은 빅데이터 유출., 에서도 높은 프로필 인스턴스는 다음과 같은 유권자 등록을 해킹 위에서 언급하고 최근 Equifax 위반(는 않았으로 인해 SQL injection,하지만 비슷한 취약성을 회사 주소),루트의 취약점을 내린 인간의 오류가 부족한 관심의 세부 사항입니다. 시간을 신중하게 생각을 통해 문제를 크게 보호하는 데 도움을 주는 사용자 데이터로서 일반 침해,특히 SQL 입니다.