2016-08-18 4 views
0

사용자 서식이 외부 웹 사이트로 전송되었으며 해당 웹 사이트의 응답에 고유 코드 (예 : "a87ju89y")가 포함되어 있습니다. 이 코드는 저에게 중요하며 준비된 문장을 사용하여 데이터베이스에 입력합니다. 백 엔드에 2 단계 SQL 삽입

나는 PHP 스크립트이 같은 새로운 코드가 있는지 확인하기 위해 데이터베이스를 쿼리 분마다 실행 cronjob에 있습니다

$con = mysqli_connect($servername, $username, $password, $database); 
if (mysqli_connect_errno()){ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$results = mysqli_query($con, "SELECT user FROM stack ORDER BY ID"); 
$cronresults = mysqli_query($con, "SELECT run FROM kook ORDER BY ID"); 
$row = mysqli_fetch_assoc($results); 
$cron = mysqli_fetch_assoc($cronresults); 
$row2 = $row['user']; 
$cron2 = $cron['kook']; 

내 질문은 그게 내가 준비된 문을 필요가있다 단순히 정보를 가져 와서 일종의 SQL 인젝션을 막는 방법? 내가 어떻게하면 나는 그것에 대해 갈 것인가?

+0

을 사용할 경우

  • 는 SQL의 끝에서 LIMIT 1 추가 결과 다른 쿼리. 'select userdata from table' 다음에 'userdata from delete userid ='를 수행했다고 가정 해보십시오. $ row [ 'userdata']','userdata'가 id라고 기대하고 있지만 실제로는'0 or 1 = 1'을가집니다. 이제 모든 데이터가 사라질 것입니다. https://en.wikipedia.org/wiki/SQL_injection#Second_order_SQL_injection – chris85

  • +0

    오케이, 이해해 주셔서 감사합니다! – electricjelly

    +0

    거의 언제나 SQL에 값을 전달할 때 매개 변수가있는 쿼리를 사용합니다. 그냥 전달하지 마십시오. – chris85

    답변

    3

    쿼리에 데이터를 전달하지 않으므로 여기에 준비된 문구가 필요하지 않습니다. 준비된 문은 쿼리를 쿼리 자체 (자리 표시 자 포함) 및 처리 할 데이터로 나눕니다. 이렇게하면 데이터 란 무엇이며 쿼리 란 무엇인지 혼란스럽지 않습니다.

    표의 모든 행을 선택하면 데이터가 필요하지 않습니다.

    +0

    좋습니다! 진짜 간단한 대답 고맙습니다. – electricjelly

    1

    준비된 문은 값을 쿼리에 연결해야하는 경우에만 유용합니다. 일반적으로 검색 할 값을 포함하는 WHERE 절이있을 때입니다. 귀하의 경우 두 쿼리 모두 움직이는 부분이 없으므로 준비된 문이 당신을 대신 할 수있는 것은 아닙니다.

    • 효율성을 위해 하나에 두 개의 쿼리를 결합 :
    • 을 항상 쿼리 당신이 가져 성공적으로 전에 실행 된 것을 확인

      보조 노트에

      , 당신은 당신의 스크립트를 개선하기 위해 몇 가지 작업을 수행 할 수 있습니다 당신이 직접 DB에 이미 데이터를 사용하는 경우에만 두 번째 수준의 주입이 발생하는 첫 번째 결과

    +0

    제안에 감사드립니다! 나는 약 1과 2를 참조 할 수있는 어떤 문서로 가야할 지 모르겠다. – electricjelly

    +0

    @electricjelly 두 테이블의'ID' 필드 (같은 순서로)가 같은 것을 참조합니까? – BeetleJuice

    +0

    아니요 둘 다 자동 번호 입력란입니다. 둘 사이의 연결이 없습니다. – electricjelly