2013-03-18 92 views
-2

我已經閱讀了有關db注入的內容,直到我眼睛發紅,論壇搜索,錯過搜索搜索....所以一個徹頭徹尾的問題。我正在使用jquery/ajax。在PHP中避免SQL注入

var characterReg = /^([0-9a-zA-NP-Z]{27,34})$/; 

僅用於基本格式驗證。這是傳遞給PHP。在數據庫查詢中使用結果安全嗎?我不是在尋找實際的比特幣地址驗證只是基本格式。

<?php 
include('myConnect.php'); 
$expire = time() + 60 * 60 * 24 * 30; 
$path = '/'; 
if (isset($address)) { 
    // Query db if address exsists. 
    $data = mysql_query("SELECT * FROM viewers WHERE address = '$address'"); 
    $info = mysql_fetch_array($data); 
    if ($info) { 
     // Build cookie data from db row array. 
     $bitAdrr = $info['address']; 
     $id = $info['id']; 
     $earn = $info['earnings']; 
     $track = $info['tracking']; 
     setcookie('user', $bitAdrr . ',' . $id . ',' . $earn . ',' . $track, $expire); 
    } else { 
     echo 'empty'; 
    } 
} 
?> 

myConnect.php

<?php 
$addr = $_GET['address']; 
// Verify address is correct format. 
if (strlen($addr) > 26 && strlen($addr) < 35 && !preg_match('/[^A-NP-Za-z0-9]/', $addr)) { 
    $server = 'mysql.myHost.com'; 
    $user = 'myUserName'; 
    $pass = 'myPassWord'; 
    $db  = 'myDataBase'; 
    // Connect to Database 
    $connection = mysql_connect($server, $user, $pass) or die("Could not connect to server. \n" . mysql_error()); 
    mysql_select_db($db) or die("Could not connect to database. \n" . mysql_error()); 
    $address = $addr; 
} else { 
    exit; 
} 
?> 

可能打針? mysql_real_escape_string(用htmlspecialchars似乎是很慢的。我寧願不要。

+0

停止嘗試擺脫做正確的事是**使用參數化查詢**。這就像你在說:「嘿,我可以在沒有戴上安全帶的情況下駕駛這條路線嗎?」當答案只是放在你的安全帶上。你爲什麼要擔心與數據庫交談的運行時間會使其變得「矮」,文本轉換代碼是多麼「慢」? – 2013-03-18 03:39:03

+0

不,謝謝。當我在我的機器上運行它時,它滯後。你能注入嗎?對不起,快速回復的數量讓我有點不知所措。謝謝。 – user2180814 2013-03-18 03:52:53

+1

我向你保證,無論你遇到什麼樣的速度問題,都不是通過調用mysql_real_escape_string引起的。使用像XDebug這樣的代碼配置文件工具來查找真正的問題。 – 2013-03-18 05:36:33

回答

0

最好的答案就是使用prepared statements,讓數據庫引擎擔心正確轉義。

全部細節都在PHP手動的,但是細節上,你首先通過提供問號佔位符聲明的變量的模板準備:

$stmt = $mysqli->prepare("SELECT * FROM viewers WHERE address = ?") 

您可以提供的參數來代替:

$stmt->bind_param("s", $address) 

然後終於執行:

$stmt->execute(); 

其他方面需要注意的是,它看起來就像你正在試圖做在客戶端(在JavaScript)的驗證,而不是在服務器端(在PHP中)。這並不安全,因爲您無法驗證所有請求是否來自網頁上運行的代碼;由於代碼在我的瀏覽器中運行,我可以簡單地選擇不運行它,並使用我喜歡的任何地址值直接向您的服務器發送請求。始終在服務器端實施數據驗證。

+0

「看起來你試圖在客戶端做你的驗證」爲ajax職位。不是PHP。 – user2180814 2013-03-18 03:55:11

+0

服務器不知道我對此字符串的期望。對不起,你很好,但你看到一個可以在代碼中被黑客攻擊的問題嗎? – user2180814 2013-03-18 04:20:35

+1

如果你所要求的是「請對這段代碼進行安全審查」,那麼這對StackOverflow來說太過本地化了。預計這裏的問題通常適用於廣泛的讀者,我會給出的一般建議是「通過使用準備好的語句來應用PHP手冊中建議的最佳實踐」。在我花費兩分鐘的時間看着你的代碼,我沒有看到問題,但我不明白爲什麼你會堅持這樣一個有風險的策略,當一個更強大的解決方案可用,需要更少的代碼寫你。 – 2013-03-18 04:28:28