2011-12-08 162 views
0

我正在使用ajax,php和mysql構建一個crm類型。我正在使用ajax xhr請求構建GET和POST請求的解決方案。我的問題是,確保這些請求不受任何類型攻擊或攻擊的最佳方式是什麼?我想確保我的客戶數據和這個crm是安全的。Ajax POST/GET安全

現在我只是使用長手ajax/javascript。我不使用太多的jquery:我的要求看起來是這樣的:

function getContacts() 
{ 

if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("div").innerHTML=xmlhttp.responseText; 
     } 
    } 
xmlhttp.open("POST","xhr_php/getContacts.php",true); 
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
var contact = document.getElementById('contact_id').value; 
xmlhttp.send("contact="+contact); 
} 

我的PHP文件看起來像這樣

$contact=$_POST['contact']; 

$sql="SELECT * 
     FROM contacts 
     WHERE contacts.contact_id = $contact"; 

所以這是我用來不僅檢索數據,但基本方法也可以插入記錄並運行所有其他查詢。我的問題是確保這些請求和sql查詢的最佳方式是什麼,以便所有數據都是安全的。我想確保這是一個安全的crm解決方案,以便數據不會被破壞,被盜,注入,黑客入侵等。感謝您的幫助。

+0

對於簡單的Ajax請求(以及其他很酷的東西),我還是建議你看一下jQuery庫,它只是對Jim的答案的一個小補充(順便提一下,100%是正確的),它更簡單,更快捷使用 –

回答

4

這是不安全的;它很容易受到SQL注入攻擊,這與Ajax,POST或GET無關。您不應該以這種方式構建SQL語句。你的問題不太適合堆棧溢出 - 「我如何使我的代碼安全」是一個無法用簡單的方法回答的廣泛的主題。如果你正在以專業的方式構建它,請找一位更高級的開發人員來幫助你解決這個問題 - 如果你犯的是基本的SQL注入錯誤,那麼你很可能無法自己構建一個完整的CRM軟件包同時使其安全。

+0

我完全知道這是不安全的,顯然這就是我發佈的原因。如果我認爲這是安全的,我不會發布這個問題。無論如何,我知道我可以將mysql_real_escape_string添加到變量中。這是否足夠安全?如果沒有,而不是批評我作爲初學者缺乏知識,你可以請張貼一些建設性的東西。謝謝。 – user982853

-3

這應該是不受SQL注入:

$contact=intval($_POST['contact']); 

$sql="SELECT * 
    FROM contacts 
    WHERE contacts.contact_id = $contact"; 

mysql_query($sql); 
+0

@Rook如果您想編輯或添加它作爲我的客人。 – Chase

+0

固定,我downvote留下,因爲你仍然完全無能爲力。 – rook

+0

想想這個,如果你發佈的廢話工作,爲什麼會存在SQL注入?我們可以通過一些函數來運行每個查詢來阻止它。雖然反指稱會是參數化查詢。 – rook

0

您應該使用PDO。以下是示例代碼。你可以根據需要修改它。

$host = 'localhost'; 
$dbname = 'contacts'; 
$username = 'anyuser'; 
$password = 'your password'; 

$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

//If contact is int value then pass it through intval function 
$contact=intval($_POST['contact']); 

$sql = 'SELECT * FROM contacts WHERE contacts.contact_id = :contact_id'; 
$statement = $conn->prepare($sql); 
$statement->bindParam(':contact_id', $contact, PDO::PARAM_INT); 
$statement->execute(); 
//Use $result is your page 
$result = $statement->fetch(PDO::FETCH_ASSOC); 

你可以插入/更新與PDO以及

$stmt = $conn->prepare("INSERT INTO Table (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 
$stmt->execute(); 

希望這有助於。