2014-10-31 114 views
0

我想爲我正在處理的事情做API,但我無法弄清楚如何解決現在有的事情。XSS&SQLi Prevention +從URL中獲取變量

我想有像登錄,如果關鍵的是正確的和匹配數據庫中的IP,然後做其他事情

if (isset($_GET['key'])) { 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) { 
     $ip = $_SERVER['HTTP_CLIENT_IP']; 
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } else { 
     $ip = $_SERVER['REMOTE_ADDR']; 
    } 

    $apikey = $_GET['key']; 
    //$apikey = mysql_real_escape_string($api); 
    echo $apikey."<br />".$ip; 

    $mysql_host = "**.***.**.***"; 
    $mysql_database = "*****"; 
    $mysql_user = "********"; 
    $mysql_password = "******************"; 

    mysql_connect($mysql_host,$mysql_user,$mysql_password); 
    @mysql_select_db($mysql_database) or die("Unable to select database"); 
    $query="SELECT * FROM `api` WHERE `apikey` = '".$apikey."' AND `ip`='".$ip"'"; 
    $result=mysql_query($query); 

    if (!$result) { 
     die(mysql_error()); 
    } 

    // assign mySQL values from table to php variables 
    $teest = mysql_result($result,1,'apikey'); 
    echo $teest; 
    //close the mySQL connection   
    mysql_close(); 
} else { 
    echo "Usage: api.php?key={YourUniqueKey}"; 
}  
+0

使用'mysql_num_rows()' – 2014-10-31 15:34:27

回答

0

一)擴展提供mysql_ *函數被標記爲deprecatd。更好地使用mysqli或PDO

b)你將兩個參數(字符串文字)放入你的sql查詢中。兩個(字符串)參數都必須正確編碼/轉義,以便它們不會干擾實際的查詢(結構)。
這是通過mysql_real_escape_string完成的。但是這個函數需要連接資源(即連接字符集)的一些信息才能正常工作。因此,只有在建立了mysql連接viw mysql_connect後,才能調用mysql_real_escape_string()。

<?php 
if (!isset($_GET['key'])) { 
    echo "Usage: api.php?key={YourUniqueKey}"; 
} 
else { 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) { 
     $ip = $_SERVER['HTTP_CLIENT_IP']; 
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    } else { 
     $ip = $_SERVER['REMOTE_ADDR']; 
    } 

    $apikey = $_GET['key']; 
    echo htmlspecialchars($apikey)."<br />".htmlspecialchars($ip); 

    $mysql_host = "**.***.**.***"; 
    $mysql_database = "*****"; 
    $mysql_user = "********"; 
    $mysql_password = "******************"; 
    $link = mysql_connect($mysql_host,$mysql_user,$mysql_password) or die('database connection failed'); 
    mysql_select_db($mysql_database, $link) or die("Unable to select database"); 

    $query = sprintf(
     " 
      SELECT 
       COUNT(*) 
      FROM 
       api 
      WHERE 
       apikey='%s' 
       AND ip='%s' 
     ", 
     mysql_real_escape_string($apikey, $link), 
     mysql_real_escape_string($ip, $link) 
    ); 
    $result=mysql_query($query, $link); 
    if (!$result) { 
     die(mysql_error()); 
    } 
    $row = mysql_fetch_row($result); 
    if ('1'==$row[0]) { 
     echo 'yay'; 
    } 
    else { 
     echo 'nay'; 
    } 
} 
+0

* 「更好地使用庫MySQLi或PDO。」 * - 使用mysqli_'的'和/或PDO並不是針對SQL注入的防範措施;不是靠自己的。使用[**'mysqli_ *'與準備好的語句**](http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php),或** PDO **與[**準備語句**](http://php.net/pdo.prepared-statements)會。 ;) – 2014-10-31 15:52:39

+0

不適合我,說SQL語法錯誤,我的PHP版本是「5.5.3」 – XeJuicY 2014-10-31 16:00:25

+0

修改代碼有點和它的作品,非常感謝你:) – XeJuicY 2014-10-31 16:06:19