2013-04-29 2 views
30

곧 생방송으로 웹 사이트를 구축하고 SQL 인젝션 방지에 대한 몇 가지 질문이 있지만 mysqli_real_escape_string을 사용하는 방법을 이해하지만 그걸 사용해야하는지 궁금합니다. 내 모든 SQL 문에 대한 변수를 가져오고 선택 문을 사용하고 있거나 그냥 삽입 및 업데이트 및 삭제를 할 때 사용해야합니까? 또한 어떤 보안에 대해서도 사전에 감사드립니다.PHP MySQLI SQL 인젝션 방지

+2

제 질문은 일반적인 SQL 주입과 관련된 질문 인 mysqli_real_escape_string과 관련이 있습니다 ... – user2201765

+1

이 질문은 종료되어서는 안됩니다. 그것은 mysqli에 특유한 것이며 검열 관이 제공 한 링크에서 답변을 얻지 못했습니다. –

+1

@JG Estiot - 잘 말하면, 너무 많은 항문 코더 - 남자는 도움이 필요합니다. 그래서 그를 도와주세요. 왜 대답하기를 원하지 않는지 설명하기보다는 대답하기 위해 노력하지 않습니다! 나는 당신과 동의한다 – kerry

답변

35

모든 쿼리는 읽기 또는 쓰기, 영구적 또는 일시적으로 주입 할 수 있습니다. 삽입은 하나의 쿼리를 끝내고 별도의 쿼리를 실행하여 수행 할 수 있습니다 (mysqli 가능). 의도 한 쿼리와 관련성이 떨어집니다.

외부 소스의 쿼리에 대한 입력이 사용자 또는 내부 쿼리인지 여부는 쿼리의 인수 및 쿼리 컨텍스트의 매개 변수로 간주해야합니다. 쿼리의 매개 변수는 매개 변수화해야합니다. 이것은 적절한 매개 변수화 된 쿼리로 연결되며,이 쿼리를 통해 준비된 명령문을 만들고 인수를 사용하여 실행할 수 있습니다. 예 :

SELECT col1 FROM t1 WHERE col2 = ? 

?은 매개 변수의 자리 표시 자입니다. mysqli을 사용하면 prepare을 사용하여 준비된 문을 만들고 bind_param을 사용하여 매개 변수에 변수 (인수)를 바인딩 한 다음 execute과 함께 쿼리를 실행할 수 있습니다. 당신은 논쟁을 전혀 없앨 필요가 없습니다 (사실 그렇게하는 것이 해 롭습니다). mysqli이 귀하를 대신합니다.전체 과정은 다음과 같습니다 매개 변수화 된 쿼리준비된 명령문 사이에 중요한 차이점도 있습니다

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?"); 
$stmt->bind_param("s", $col2_arg); 
$stmt->execute(); 

.

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])"); 

이 요약 :

  • 모든 쿼리가 제대로 매개 변수화해야한다 (그들은 어떤 매개 변수가없는 한)
  • 이 문장은, 준비하면서, 매개 변수화하지 않고 주입하여 취약
  • 모두 쿼리에 대한 인수는 소스에 관계없이 가능한 한 적대적인 것으로 처리되어야합니다
+0

임의의 수의 요소로 IN 또는 SET 절과 함께이 마법 문을 사용하는 방법을 보여 주면 좋을 것입니다. . 그렇지 않으면 화면에 쉽게 표시되지만 집에서는 사용할 수 없게됩니다. –

+0

@YourCommonSense 나는이 질문의 범위를 벗어났다.하지만 나는이 대답과 같은 것을하는 경향이있다 : http://stackoverflow.com/a/10698906/454533 –

+0

매우 상세한 답변을 해주셔서 감사합니다! 이것은 mysqli_real_escape_string을 사용하는 것보다 더 나은 해결책 인 것 같습니다. 조금 더 자세히 살펴보고 구현해 드리겠습니다. 정말 고마워요! – user2201765

4

그것은 초 만에 종료됩니다, 그러나 다만 일을하기 위해 바로

난 당신이하지 두려워

mysqli_real_escape_string 사용하는 방법을 이해합니다.

내가 내 SQL 문

확실히

하지 않는군요 모든 변수에 그것을 사용하는 경우.
이 기능은

내가 삽입 업데이트에도하거나 선택 진술을하고있을 때 그것을 사용하고 삭제해야합니까 SQL 문자열을 포맷하는 데 사용되어야한다?

ny SQL 문. 그러나 다시,하지 "mysqli_real_escape_string를 사용하여"하지만

은 또한 어떤 다른 보안 것은 당신이

에 대한 SQL 보안을 추천 할 것입니다

제대로 완전히 리터럴를 포맷하고 - 제대로 문자열하지만 의 리터럴뿐만 아니라 포맷해야 어떤 종류. 그리고 각기 다른 서식 규칙 집합이 필요합니다.

+2

이것은 답변이 아닙니다. 그것을 제거하십시오. 함수 자체에 관해서는 그것을 사용하는 방법을 이해하고 있습니다. 나는 그것을 사용하기 위해 필요한 모든 것에 정확히 100 %가 아닙니다. – user2201765

+0

이 답변을 개선하십시오. "당신은 포맷해야합니다 ..."라는 의미입니다. 예제 나 규칙 등을주세요. – Chiwda

+0

@Chiwda 여기 있습니다 : https://phpdelusions.net/sql_injection#formatting –