2014-03-13 2 views
-1

이 스 니펫은 아포스트로피가있는 데이터베이스 항목에 도달 할 때까지 올바르게 작동합니다. 나는 그들을 끌어 낸 후에 이것을 피할 필요가 있음을 알았다. PHP에 익숙하지 않아서 PDO와 "->"및 mysqli_real_escape_string()에 대한 모든 정보를 어떻게 처리해야할지 모르겠습니다. 나는 그걸로 조금 혼란스러워. $ team1rows와 $ team2rows를 어떻게 탈출하여 내 페이지로 다시 보낼 수 있습니까? 감사.PHP에서 문자열 이스케이프 처리

$team1rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'")); 
$team2rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'")); 

echo $team1rows . "|" . $team2rows; 

에코는 아포스트로피에 도달 할 때까지 정상적으로 작동합니다.

+1

PDO 준비된 진술 : http://us1.php.net/pdo.prepared-statements, mysqli_real_escape_string() : http://us1.php.net/mysqli_real_escape_string MySQLi 준비 진술서 : http://php.net/ manual/ko/mysqli.prepare.php 임의 튜토리얼 : http : //forum.codecall.net/topic/44392-php-5-mysqli-prepared-statements/ – teynon

+0

지루한 mysqli 이스케이프 기능이 PDO와 관련이 있다는 결론에 어떻게 올 수 있었습니까? 어떤 설명서 또는 튜토리얼을 통해 여행 했습니까? – mario

+0

@Tom 링크를 제공해 주셔서 감사합니다. 이 작업을 수행하는 더 좋은 방법이있는 것처럼 들리지만 저는 거의 thsi 프로젝트로 끝났습니다. 그래서 다시 시작해야하는 것을 싫어할 것입니다. 링크에서 나는 성공하지 못하고 다음을 시도했다. $ team1number = mysqli_real_escape_string ($ connection, $ team1rows); – Layne

답변

0

대신 PDO를 사용하면 prepare 문을 올바르게 사용하면 SQL 주입을 방지 할 수 있습니다. mysqli_query는 더 이상 사용하지 않아야하는 오래된 메소드이다. 예를 들어 아래에 나열된 참조 :

<?php 
$pdo = new PDO('sqlite:users.db'); 
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); 
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO 
$stmt->execute(); 

출처 : http://www.phptherightway.com/#databases

더 -> 당신이 개체의 방법을 다루고있는 것을 의미한다. 그래서 : $의 PDO가 그런 다음 사용하여 내 메소드 (함수)에 액세스 할 수있는 객체입니다 - 예를 들어> $ pdo-> 준비

+0

PDO로 전환하고 싶으면 다시 시작하십시오. 불행히도, 내가 따르고있는 튜토리얼은 그것을 사용하지 않았고 나는 그대로있는 것처럼 간직하고있다. 다음 프로젝트의 PDO가 더 가능성이 높습니다. 평균적으로, $ team1number = mysqli_real_escape_string ($ connection, $ team1rows); 어느 쪽도 일하지 않았다. – Layne

+0

@Layne 필자는이 시점에서 PDO로 전환하지 않는 것에 동의 할 수 있습니다 (새 프로젝트를 위해 권장 할만하지만). 그러나 mysqli *도 준비된 명령문을 지원하며 사용할 쿼리를 최소한으로 변경해야합니다. – user2864740

0

tldr; use placeholders (aka parameterized queries/prepared statements). 이로 인해 모두SQL Injection이 제거됩니다. 데이터에 아포스트로피가 포함되어 있으면 실수로 깨진 쿼리가 포함됩니다!

mysqli supports placeholders부터 PDO로 전환 할 필요가 없습니다! 나는 mysqli-object API를 사용하는 것을 권장하지만 non-OOP mysqli 구문으로 코드를 남겼다. 다음 코드는 이 아니며은 "이스케이프"를 수행하지 않습니다. 수행 된 경우 구현의 세부 사항 일뿐입니다. 그것은 쿼리 모양에 관련이 있지만 데이터가 아니기 때문에

# Create prepared statement, bind parameters - no apostrophe-induced error! 
# - With placeholders there is need to worry about quoting at all 
# - I recommend explicitly selecting columns 
# - $page is NOT data in the query and cannot be bound in a placeholder 
$stmt = mysqli_prepare($connection, "SELECT * FROM $page WHERE vote = ?"); 
mysqli_stmt_bind_param($stmt, "s", $vote); 

# Execute prepared statement 
$result = mysqli_stmt_execute($stmt); 

# Use results somehow; 
# Make sure check $result/execution for errors! 
# (PDO is nice because it allows escalation of query errors to exceptions.) 
$count = mysqli_num_rows($result); 

자, 위의에 따라, $ 페이지가 자리에 바인딩 할 수 없습니다. 이 특별한 경우에 접근 할 수있는 한 가지 방법은 스키마를 일반적으로 다시 디자인하지 않는 경우 use a whitelist approach입니다. 예를 들어,

$approvedPages = array("people", "tools", "pageX"); 
if (!in_array($page, $approvedPages)) { 
    # Wasn't a known page - might have been something mischievous! 
    # Choose default approved page or throw error or something. 
    $page = $approvedPages[0]; 
} 
-1

내가 잘못한 것을 알았습니다. 나의 부분에 아마추어 실수. 쿼리의 결과를 피하려고했습니다. 그러나이 경우 결과는 NUMBER 개의 행으로 나타납니다. 그래서 결과는 단지 숫자 일 뿐이므로 문제가되지 않았습니다. 그 숫자는 그 안에 아포스트로피가있는 값과 관련되어 있기 때문에 혼란 스러웠습니다. 그래서 쿼리에 사용 된 문자열이 이스케이프 처리되지 않았으므로 결과가 아니라 실패 할 수 있습니다. 나는이 같은 쿼리에서 사용 된 변수를 탈출 FIRST하여 그래서

... 다음 쿼리를 사용하는 나에게 좋은 문자열을 준
$page = mysqli_real_escape_string($connection, $page); 
$team1 = mysqli_real_escape_string($connection, $team1); 
$team2 = mysqli_real_escape_string($connection, $team2); 

.

$team1number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'")); 
$team2number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'")); 

echo $team1number . "|" . $team2number; 

다시 거슬러 올라가서 결과를 벗어나려고했습니다. 멍청한 놈은 내 부분을 움직 였지만이 발견 덕분에 많은 것을 배웠습니다. 모두에게 감사드립니다.

+0

불행히도, 당신은 많은 나쁜 것들을 배웠습니다 –

+0

제가 올바른 방법을 배울 수 있도록 그것들이 무엇인지 말해 줄 수 있습니까? – Layne

+1

http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php for startter –

관련 문제