2011-12-08 13 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

また、Jimの答え(ほんとうに100%正しい人)にちょっと加えて、単純なAjaxリクエスト(そして他のクールなものも)のためにjqueryライブラリを見ることをお勧めします)。 –

答えて

4

これは安全ではありません。それはAjax、POSTまたはGETとは何の関係もないSQLインジェクション攻撃に対して脆弱です。そのようにしてSQL文を作成するべきではありません。あなたの質問はStack Overflowにはあまり適していません - 「コードを安全にするにはどうすればいいですか」は簡単な方法では答えられない膨大なトピックです。あなたがプロの能力でこれを構築しているなら、これを手伝ってくれる上級開発者を探してください - あなたは基本的な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(); 

希望を挿入/更新を行うことができます。

関連する問題