2011-09-27 2 views
-1

이 코드를 수정하여 SQL 인젝션 및 기타 위협으로부터 어떻게 보호 할 수 있습니까? 이것은 MS SQL 데이터베이스입니다.SQL 인젝션 및 기타 위협으로부터 PHP 코드를 개선하는 방법

<?php include_once("db.php"); ?> 

<?php 
$id = $_REQUEST['id']; 
settype($id, 'string'); 

$tsql = "SELECT Table1.Fund FROM Table1 WHERE Table1.Fund='%s'"; 
$tsqlnew=sprintf($tsql, $id); 

$stmt = sqlsrv_query($conn, $tsqlnew); 
if($stmt === false) 
{ 
echo "Error in query preparation/execution.\n"; 
die(print_r(sqlsrv_errors(), true)); 
} 

$chd = ''; 

while($data = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
$chd .= '[\''.$data['Fund'] .'\'],'; 
} 
$chd = substr($chd,0,-1); 

?> 

내 DB 연결을 개선 할 수 있는지 궁금합니다. 당신의 도움을 주셔서 감사합니다!

<?php 

$myServer = "server"; 
$myUser = "userPlaceHolder"; 
$myPass = "passwordPlaceHolder"; 
$myDB = "SQL"; 

$conn = sqlsrv_connect($myServer, array('UID'=>$myUser, 'PWD'=>$myPass, 'Database'=>$myDB)); 

if($conn === false) 
{ 
echo "Could not connect.\n"; 
die(print_r(sqlsrv_errors(), true)); 
} 
?> 
+0

$ _REQUEST [ 'id']이 입력 필드에서 오는 것으로 가정합니다. mysql_real_escape_string 함수를 사용하여 문자열에서 특수 문자를 스케치하십시오. http://php.net/manual/en/function.mysql-real-escape-string.php – B4NZ41

+0

가능한 복제본 [PHP로 사용자 입력을 살균하는 가장 좋은 방법은 무엇입니까?] (http://stackoverflow.com)/questions/129677/whats-the-best-sanitizing-user-input-with-PHP) –

+0

솔직히? 전체 코드를 변경하십시오! 필자가 생각하기에, 이미 제안 된 마크 B가 PHP 5를 사용해야 할지라도 http://php.net/PDO와 http://php.net/Filter에 대해 읽는 것이 훨씬 낫다. 귀하의 코드는 90 년대와 비슷하게 보입니다. PHP 코딩 사례를 읽는 데 몇 시간의 시간이 걸릴 것 같습니다. –

답변

6

당신의 코드를 주입 ​​공격을 방지하기 위해 정확히 아무것도하지 않습니다. 변수에 문자열 데이터 형식을 사용하는 것만으로 쓰레기를 막을 수있는 화장지와 똑같은 보호 기능을 제공합니다.

삽입 공격을 방지하려면 사용자가 제공 한 문자열이든 사용자가 직접 작성하거나 삽입 한 문자열이든 쿼리 문자열에 삽입 한 모든 데이터를 이스케이프 처리해야합니다.

가장 좋은 방법은 prepared statements을 사용하는 것으로 데이터 이스케이프의 책임을 덜어줍니다.

삽입되는 데이터가 "악성"이 아니더라도 모든 SQL 메타 문자 (특히 따옴표)는 여전히 쿼리를 파괴하고 구문 오류를 일으킬 수 있습니다.

+0

화장지의 전체 질량이 쓰나미보다 더 많은 에너지를 저장하고 있다면, 화장지가 실제로 이깁니다.) – hakre

+0

@ 하쿠르 : 큰 조각이 필요한 후방을보고 싶지 않을 것입니다 ... " 달 ... " –

+0

감사합니다, 링크는 매우 도움이됩니다. 원래이 [link] (http://php.net/manual/en/security.database.sql-injection.php)에서 제안 된대로 settype() 코딩을 사용했지만, 분명히 좋은 해결책이 아니므로 작동 할 것입니다. 입력이 수치면 더 좋습니다. – tito

관련 문제