2010-05-24 2 views
0

나는 자산 데이터베이스 문제에 대해 연구 중이다. 나는 을 $_GET["id"];에서 얻습니다. 그런 다음 데이터베이스에 쿼리하고 결과를 표시합니다. 내 ID는 "93650"와 같은 정수이지만은 "wci1001"와 같은 다른 문자가있는 경우, 그것은이 MySQL의 오류가 표시되는 경우int를 사용하여 쿼리 할 수 ​​있지만 여기에는 문자열을 사용할 수없는 이유는 무엇입니까? PHP MySQL 데이터 유형

이 작동 :에

알 수없는 열 '텍스트' 'where 절'

테이블의 모든 입력란은 다음 형식입니다. VARCHAR(50)

이 쿼리를 사용하여 다른 문자가 포함 된 ID로 검색하려면 어떻게해야합니까?

감사합니다.

<?php 

<?php 

/* 
* ASSET DB FUNCTIONS SCRIPT 
* 
*/ 

# connect to database 
function ConnectDB(){ 

    mysql_connect("localhost", "asset_db", "asset_db") or die(mysql_error()); 
    mysql_select_db("asset_db") or die(mysql_error()); 
} 

# find asset type returns $type 
function GetAssetType($id){ 

    $sql = "SELECT asset.type 
    From asset 
    WHERE asset.id = $id"; 
    $result = mysql_query($sql) 
    or die(mysql_error()); 
    $row = mysql_fetch_assoc($result); 
    $type = $row['type']; 
    return $type; 
} 

# query server returns $result (sql query array) 
function QueryServer($id){ 

    $sql = " 
    SELECT asset.id 
    ,asset.company 
    ,asset.location 
    ,asset.purchaseDate 
    ,asset.purchaseOrder 
    ,asset.value 
    ,asset.type 
    ,asset.notes 
    ,server.manufacturer 
    ,server.model 
    ,server.serialNumber 
    ,server.esc 
    ,server.warranty 
    ,server.user 
    ,server.prevUser 
    ,server.cpu 
    ,server.memory 
    ,server.hardDrive 
    FROM asset 
    LEFT JOIN server 
     ON server.id = asset.id 
    WHERE asset.id = $id 
    "; 
    $result = mysql_query($sql); 
    return $result; 
} 



# get server data returns $serverArray 
function GetServerData($result){ 

    while($row = mysql_fetch_assoc($result)) 
    { 
     $id = $row['id']; 
     $company = $row['company']; 
     $location = $row['location']; 
     $purchaseDate = $row['purchaseDate']; 
     $purchaseOrder = $row['purchaseOrder']; 
     $value = $row['value']; 
     $type = $row['type']; 
     $notes = $row['notes']; 
     $manufacturer = $row['manufacturer']; 
     $model = $row['model']; 
     $serialNumber = $row['serialNumber']; 
     $esc = $row['esc']; 
     $warranty = $row['warranty']; 
     $user = $row['user']; 
     $prevUser = $row['prevUser']; 
     $cpu = $row['cpu']; 
     $memory = $row['memory']; 
     $hardDrive = $row['hardDrive']; 
     $serverArray = array($id, $company, $location, $purchaseDate, $purchaseOrder, 
      $value, $type, $notes, $manufacturer, $model, $serialNumber, $esc, $warranty, 
      $user, $prevUser, $cpu, $memory, $hardDrive); 
    } 
    return $serverArray; 
} 

# print server table 
function PrintServerTable($serverArray){ 

    $id = $serverArray[0]; 
    $company = $serverArray[1]; 
    $location = $serverArray[2]; 
    $purchaseDate = $serverArray[3]; 
    $purchaseOrder = $serverArray[4]; 
    $value = $serverArray[5]; 
    $type = $serverArray[6]; 
    $notes = $serverArray[7]; 
    $manufacturer = $serverArray[8]; 
    $model = $serverArray[9]; 
    $serialNumber = $serverArray[10]; 
    $esc = $serverArray[11]; 
    $warranty = $serverArray[12]; 
    $user = $serverArray[13]; 
    $prevUser = $serverArray[14]; 
    $cpu = $serverArray[15]; 
    $memory = $serverArray[16]; 
    $hardDrive = $serverArray[17]; 

    echo "<table width=\"100%\" border=\"0\"><tr><td style=\"vertical-align:top\"><table width=\"100%\" border=\"0\"><tr><td colspan=\"2\"><h2>General Info</h2></td></tr><tr id=\"hightlight\"><td>Asset ID:</td><td>"; 
    echo $id; 
    echo "</td></tr><tr><td>Company:</td><td>"; 
    echo $company; 
    echo "</td></tr><tr id=\"hightlight\"><td>Location:</td><td>"; 
    echo $location; 
    echo "</td></tr><tr><td>Purchase Date:</td><td>"; 
    echo $purchaseDate; 
    echo "</td></tr><tr id=\"hightlight\"><td>Purchase Order #:</td><td>"; 
    echo $purchaseOrder; 
    echo "</td></tr><tr><td>Value:</td><td>"; 
    echo $value; 
    echo "</td></tr><tr id=\"hightlight\"><td>Type:</td><td>"; 
    echo $type; 
    echo "</td></tr><tr><td>Notes:</td><td>"; 
    echo $notes; 
    echo "</td></tr></table></td><td style=\"vertical-align:top\"><table width=\"100%\" border=\"0\"><tr><td colspan=\"2\"><h2>Server Info</h2></td></tr><tr id=\"hightlight\"><td>Manufacturer:</td><td>"; 
    echo $manufacturer; 
    echo "</td></tr><tr><td>Model:</td><td>"; 
    echo $model; 
    echo "</td></tr><tr id=\"hightlight\"><td>Serial Number:</td><td>"; 
    echo $serialNumber; 
    echo "</td></tr><tr><td>ESC:</td><td>"; 
    echo $esc; 
    echo "</td></tr><tr id=\"hightlight\"><td>Warranty:</td><td>"; 
    echo $warranty; 
    echo "</td></tr><tr><td colspan=\"2\">&nbsp;</td></tr><tr><td colspan=\"2\"><h2>User Info</h2></td></tr><tr id=\"hightlight\"><td>User:</td><td>"; 
    echo $user; 
    echo "</td></tr><tr><td>Previous User:</td><td>"; 
    echo $prevUser; 
    echo "</td></tr></table></td><td style=\"vertical-align:top\"><table width=\"100%\" border=\"0\"><tr><td colspan=\"2\"><h2>Specs</h2></td></tr><tr id=\"hightlight\"><td>CPU:</td><td>"; 
    echo $cpu; 
    echo "</td></tr><tr><td>Memory:</td><td>"; 
    echo $memory; 
    echo "</td></tr><tr id=\"hightlight\"><td>Hard Drive:</td><td>"; 
    echo $hardDrive; 
    echo "</td></tr><tr><td colspan=\"2\">&nbsp;</td></tr><tr><td colspan=\"2\">&nbsp;</td></tr><tr><td colspan=\"2\"><h2>Options</h2></td></tr><tr><td colspan=\"2\"><a href=\"#\">Edit Asset</a></td></tr><tr><td colspan=\"2\"><a href=\"#\">Delete Asset</a></td></tr></table></td></tr></table>"; 
} 


?> 

/* 
* View Asset 
* 
*/ 

# include functions script 
include "functions.php"; 

$id = $_GET["id"]; 
if (empty($id)):$id="000"; 
endif; 
ConnectDB(); 
$type = GetAssetType($id); 

?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<link rel="stylesheet" type="text/css" href="style.css" /> 
<title>Wagman IT Asset</title> 
</head> 

<body> 
    <div id="page"> 
       <div id="header"> 
        <img src="images/logo.png" /> 
       </div> 

       </div> 

       <div id="content"> 
        <div id="container"> 

         <div id="main"> 
         <div id="menu"> 
          <ul> 
           <table width="100%" border="0"> 
           <tr> 
           <td width="15%"></td> 
           <td width="30%%"><li><a href="index.php">Search Assets</a></li></td> 
           <td width="30%"><li><a href="addAsset.php">Add Asset</a></li></td> 
           <td width="25%"></td> 
           </tr> 
           </table> 
          </ul> 
         </div> 
         <div id="text"> 
         <ul> 
         <li> 
         <h1>View Asset</h1> 
         </li> 
         </ul> 
         <?php 
         if (empty($type)):echo "<ul><li><h2>Asset ID does not match any database entries.</h2></li></ul>"; 
         else: 
         switch ($type){ 
         case "Server": 
         $result = QueryServer($id); 
         $ServerArray = GetServerData($result); 
         PrintServerTable($ServerArray); 
         break; 
         case "Desktop"; 

         break; 
         case "Laptop"; 

         break; 
         } 
         endif; 
         ?> 


         </div> 

         </div> 
       </div> 
       <div class="clear"></div> 
       <div id="footer" align="center"> 
        <p>&nbsp;</p> 
       </div> 
       </div> 
       <div id="tagline"> 
       Wagman Construction - Bridging Generations since 1902 
       </div> 


</body> 
</html> 
+0

저는 이것이 SQL Injection을 위해 광범위하게 개방되어 있다는 것을 알고 있습니다. 그러나 이것은 단지 제 자신의 학습을위한 것입니다. 그래서 나는 처음에 일을 간단하게하려고 노력하고 있습니다. –

답변

3

견적이 같은 변수 __ :

WHERE asset.id = '$id' 
+0

SQL 주입! – SLaks

+0

완벽. 고맙습니다. –

+0

** 틀린 **. 완벽하지는 않습니다. – SLaks

2

당신은 SQL 주입 취약점을 가지고있다.

PDO을 사용하여 매개 변수가있는 쿼리를 사용해야합니다.

또한 htmlspecialchars을 사용하여 데이터를 HTML 인코딩해야합니다.

+0

'필요가 있습니다. 사람들은 PDO없이 50 년 동안 같이 지내 왔습니다. 그러나 준비된 문장과 출력을 이스케이프 처리하는 HTML은 정말 좋은 아이디어가 될 것입니다. :) – cHao

2

다른 언급과 마찬가지로, 작은 따옴표로 간단하게 인용하는 것은 큰 보안 위험입니다. 미리 데이터에 mysql_real_escape_string을 사용하거나 PDO와 같은 확장을 사용하여 매개 변수가있는 명령문을 자동으로 인용합니다.

저장 전에 htmlspecialchars를 사용하지 않아도되지만 (입력 상태로 되돌릴 필요가있을 경우를 대비하여 권장하지 않습니다.) HTML/스크립트 태그가 출력되지 않도록 출력하기 전에 위생 처리해야합니다 파싱되다.

관련 문제