[SQL] SQL 주입은 무엇인가? [복제]
SQLSQL 주입은 무엇인가? [복제]
누군가가 SQL 주입을 설명 할 수 있습니까? 어떻게 취약점의 원인이 무엇입니까? 정확히 어디 SQL 주입되는 지점은?
해결법
-
==============================
1.누군가가 SQL 주입을 설명 할 수 있습니까?
누군가가 SQL 주입을 설명 할 수 있습니까?
당신은 SQL 쿼리 문자열에 일부 콘텐츠를 보간 할 때 SQL 주입이 발생하고, 방법으로 결과 수정 쿼리의 구문은 당신이 의도하지 않았다.
그것은 악성 될 필요가 없습니다, 그것은 사고가 될 수 있습니다. 그러나 실수로 SQL 주입 취약점에 비해 오류가 발생할 가능성이 더 높습니다.
유해 컨텐츠가 사용자로부터 올 필요가 없습니다, 당신의 응용 프로그램이 모든 소스에서 얻을, 또는 코드에서 자체 생성하는 내용이 될 수 있습니다.
어떻게 취약점의 원인이 무엇입니까?
공격자는 그들이 SQL 문자열로 보간 될 것입니다 알고있는 응용 프로그램에 값을 보낼 수 있기 때문에 취약점으로 이어질 수 있습니다. 매우 영리한되고, 그들은 그들이 할 수되어서는 안된다는 데이터를 변경하더라도 데이터를 읽거나, 쿼리의 결과를 조작 할 수 있습니다.
PHP의 예 :
$password = $_POST['password']; $id = $_POST['id']; $sql = "UPDATE Accounts SET PASSWORD = '$password' WHERE account_id = $id";
지금 공격자 세트 POST 요청 매개 변수를 가정 "암호 = xyzzy를"및 "ID = ACCOUNT_ID"다음 SQL 결과 :
UPDATE Accounts SET PASSWORD = 'xyzzy' WHERE account_id = account_id
나는 $ ID가 정수가 될 것으로 예상되지만, 공격자는 컬럼의 이름 인 문자열을 선택했다. 공격자는 단지 모든 계정에 대한 암호를 설정 한 그래서 물론 지금의 상태는, 모든 행에 해당됩니다. 권한이있는 사용자를 포함하여 - 이제 공격자는 사람의 계정에 로그인 할 수 있습니다.
정확히 어디 SQL 주입되는 지점은?
그것은 주입, 보간의 IT의 내용이 내가 의도 한 것보다 쿼리의 다른 종류의 결과로 SQL 문자열로 ( "주사 ')에 SQL이 아니다. 나는 그것을 확인하지 않고 동적 컨텐츠를 신뢰하고 맹목적 결과 SQL 쿼리를 실행. 즉 여기서 문제가 시작이다.
SQL 인젝션은 데이터베이스 또는 데이터베이스 액세스 라이브러리 또는 프레임 워크에 있지 일반적으로, 응용 프로그램 코드의 잘못이다.
SQL 주입 대부분의 경우 쿼리 매개 변수를 사용하여 방지 할 수 있습니다. 내가 PHP에서 SQL 주입을 방지 할 수 방법을 참조하십시오? 예를 들어.
-
==============================
2.응용 프로그램의 사용자가 데이터베이스 쿼리의 의미에 영향을 미칠 수있을 때 SQL 주입이 발생합니다. 사용자 입력으로 인해 임의의 문자열이 데이터베이스에 공급되는 SQL을 만들 연결될 때이 종종 발생한다. 예를 들어 우리는 다음과 같은 코드를 가지고 말할 수 (PHP에서,하지만 같은 어떤 언어도 마찬가지) 사용자 로그인을 처리하는 데 사용할 수 있습니다.
응용 프로그램의 사용자가 데이터베이스 쿼리의 의미에 영향을 미칠 수있을 때 SQL 주입이 발생합니다. 사용자 입력으로 인해 임의의 문자열이 데이터베이스에 공급되는 SQL을 만들 연결될 때이 종종 발생한다. 예를 들어 우리는 다음과 같은 코드를 가지고 말할 수 (PHP에서,하지만 같은 어떤 언어도 마찬가지) 사용자 로그인을 처리하는 데 사용할 수 있습니다.
$sql = "SELECT FROM users WHERE username='".$_GET['username']."' AND password='".$_GET['password']."'";
사용자가 뭔가를 입력 할 때 피해가 완료
administrator'; --
... 사용자 이름에 대한. 적절한 인코딩없이 쿼리가된다 :
SELECT * FROM users WHERE username='administrator'; -- AND password=''
문자열의 나머지 부분을 무시하도록 데이터베이스 서버를 일으키는 SQL 주석을 시작 - 여기서 문제는이 '다음 사용자 이름 필드 밖으로 사용자 이름 닫히고에 있다는 것입니다. 최종 결과는 이제 암호를 알아야 할 필요없이 관리자로 로그인 할 수있는 사용자입니다. SQL Inection 또한, UPDATE를 실행 DELETE 또는 DROP 쿼리 정말 데이터베이스를 손상 할 수 있습니다.
SQL 인젝션은 매개 변수화 쿼리를 사용하거나 (예 : () PHP로는 mysql_real_escape_string으로) 언어 / 툴 킷의 탈출 기능을 적용하여 방지 할 수있다.
당신은 SQL 인젝션을 이해하면이 만화 뒤에 농담을 얻을 것이다.
-
==============================
3.물건이 데이터는 마지 못해 SQL 코드로 처리 할 예정 that're 때 SQL 주입입니다.
물건이 데이터는 마지 못해 SQL 코드로 처리 할 예정 that're 때 SQL 주입입니다.
당신이 있다면 예를 들어,해야 할 일
mysql_query("SELECT * FROM posts WHERE postid=$postid");
일반적으로 그것은 당신에게 주어진 ID로 게시물을 얻을 수 있지만, $ postid이 문자열을 10으로 설정되어 있다고 가정 것; DROP 표 포스트 -; 갑자기, 당신이 보내는 실제 쿼리입니다
mysql_query("SELECT * FROM posts WHERE postid=10; DROP TABLE posts --");
이 때문에 악의적 인 사용자에 전체 게시물 테이블을 잃는 것 이것은 매우 문제가 - 오, 사랑.
이 문제를 방지하는 가장 쉬운 방법은 PDO 또는 MySQLi를 통해 예를 들어, 준비된 문을 사용하는 것입니다.
PDO에서 이에 해당하는 예는 것
$statement = $db->prepare('SELECT * FROM posts WHERE postid = :postid'); $statement->bindValue(':postid', $postid); $statement->execute();
이 보장하지만를 수행하면 데이터베이스 시스템은 $ postid 데이터가 아닌 코드로 취급하는 것입니다, 따라서 적절하게 처리 될 것으로 알고있다.
-
==============================
4.이 질문에 유래에 여러 번 대답했습니다,하지만 모두가 알아야하는 것은 내가이 질문을 닫습니다 투표를하지 않을거야, 그래서 중요한 주제입니다.
이 질문에 유래에 여러 번 대답했습니다,하지만 모두가 알아야하는 것은 내가이 질문을 닫습니다 투표를하지 않을거야, 그래서 중요한 주제입니다.
다음은이 주제에 대한 나의 과거 몇 가지 답변에 대한 링크는 다음과 같습니다
또한 이번 달은 MySQL 컨퍼런스에서 프레젠테이션을주고, 내 슬라이드가 온라인 :
-
==============================
5.악의적 인 사용자가 시도하고 서버에 SQL을 실행하려면 입력 필드에 SQL을 넣어 곳 SQL 주입입니다.
악의적 인 사용자가 시도하고 서버에 SQL을 실행하려면 입력 필드에 SQL을 넣어 곳 SQL 주입입니다.
내가 준수한다는 # 1 충고는 오히려 코드에서 원시 SQL을 구축하는 것보다 매개 변수화 된 저장 프로 시저를 사용하는 것입니다.
저장 프로 시저 매개 변수는 대부분의 경우 그들이 안전하고, 실행되지 않습니다.
-
==============================
6.SQL 서버 응용 프로그램에서 고급 SQL 인젝션 : 나는 SQL 주입 기술에 대한 매우 좋은 읽기 (링크 PDF이다)가이 종이를 발견했다.
SQL 서버 응용 프로그램에서 고급 SQL 인젝션 : 나는 SQL 주입 기술에 대한 매우 좋은 읽기 (링크 PDF이다)가이 종이를 발견했다.
"고급"라는 타이틀에도 불구하고, 당신이 SQL 주입에 대한 많은 지식이없는 경우에도 꽤 읽을 수 있습니다.
-
==============================
7.일반적인 배경은 SQL 주입에 위키 백과 문서를 체크 아웃 얻으려면.
일반적인 배경은 SQL 주입에 위키 백과 문서를 체크 아웃 얻으려면.
짧은 SQL 주입 공격은 데이터베이스의 데이터 도난과 파괴의 모든 영지에 당신이 취약 남길 수 있습니다. 시스템에 무엇을 할 수 있는지의 정확한 세부 사항은 시스템 자체의 세부 사항에 따라 달라집니다.
당신이 당신의 데이터베이스에 사용자로부터 입력을 통과 할 때마다 당신은 잠재적 인 주입 지점이있다. 웹 응용 프로그램은 새로운 프로그래머는 종종 사용자의 입력을 처리하는 위험을 이해하지 않기 때문에 종종이 점에서 부족 및 웹 응용 프로그램은 당신이 당신의 프로그램을 찾을 것이라고 결코 생각하지 않았다 매우 똑똑한 사람들에 의해 공격.
-
==============================
8.당신은 코드 프로젝트에서이 글을 좋아합니다; )
당신은 코드 프로젝트에서이 글을 좋아합니다; )
-
==============================
9.SQL 주입되는 점은 응용 프로그램이 사용자의 입력을 받아들이는 임의의 지점입니다.
SQL 주입되는 점은 응용 프로그램이 사용자의 입력을 받아들이는 임의의 지점입니다.
이 웹 응용 프로그램의 위험한 취약점이됩니다 여부는이 입력 나중에 제대로 유형을 확인하고 필요한 경우를 탈출하지 않고 SQL 쿼리의 일부로 사용 여부에 따라 달라집니다.
적절한 거의 그대로 어떤 SQL 코드가 SQL 코드보다는 단순한 문자열 또는 값으로 SQL 엔진에 의해 실행될 수있는 사용자 "주입".
from https://stackoverflow.com/questions/601300/what-is-sql-injection by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 FULL OUTER MySQL의에 가입 할까? (0) | 2020.03.05 |
---|---|
[SQL] 효율적으로 SQL 서버에 열을 행으로 변환 (0) | 2020.03.05 |
[SQL] 동적 열 수로 MySQL의 피봇 행 (0) | 2020.03.05 |
[SQL] 열에 대해 최대 값을 갖는 행을 페치 (0) | 2020.03.05 |
[SQL] 내가 항목 X에 액세스 할 수 있도록 어떻게 문자열을 분할합니까? (0) | 2020.03.05 |