2017-08-04 6 views
1

私はまだ、自分のコードをできるだけ小さく、効果的に書いています。JS-> PHP-> mySQLの値をループするのは悪い方法ですか?

だから私の定期的なアプローチHTMLフォームからMySQLへの挿入データが でjQueryを使って入力値をフェッチしている間:

var formdata = {}; 
    $('.formdata').each(function(){ 
     formdata[ $(this).attr('name') ] = $(this).val(); 
}); 

は、AjaxとPHPにそれを送信します。

$.ajax({ 
     url: 'file.php', 
     method: 'post', 
     data: {formdata: formdata}, 
     success: function(result){ 
      console.log(result) 
     } 
}); 

グラブPOSTと配列に入れて:

$params_array = array(
     ':artNr' => $_POST['formdata']['artNr'], 
     ':etc' => $_POST['formdata']['etc'], 
); 

最後にそれをmに入れますYSQL:

$query = "INSERT INTO table SET artNr = :artNr, etc = :etc"; 
    try{ 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($params_array); 
    } 
    catch(PDOException $ex){ 
     die("Failed to run query: " . $ex->getMessage()); 
    } 

私の質問は今ある:
が配列へのPOSTからの値でループに悪いアプローチですか?尋ねるため

foreach($_POST['formdata'] as $name => $value){ 
    $params_array[$name] = $value; 
} 

理由は、私はあなたが私のJSにものを送ることができます場合は、コンソールからとかハッキングん「[] FORMDATA」知っているドントということでしょうか?

私は、HTMLフォームに存在するものを私のデータベースにループしていることを意味しています。私の "params_array"にハードコーディングされたキーがなければ..
マビーには私が気づいていないさらに多くのセキュリティホールがありますか?

私はPDOがSQLインジェクションからかなり安全であることを知っていますか?

+0

PDOはSQL Injectionsから保護されていません。 'mysqli_'ドライバでも同じことをすることができます。それは安全です。私はこれがあなたの質問に全く答えないことを知っています、ちょっとしたメモです。 – Twinfriends

+0

いくつかの考えでは、 'file.php'が返すと予想されるデータ型を正確に記述する必要があります。あなたの '$ .ajax'プロパティ' 'dataType:" json "'を設定し、 '' file.php'の中で結果を返すようアドバイスします: 'echo json_encode($ result-> fetchAll() )); ' –

+0

@AnwarNairi echo json_encodeで返すためにdataTypeをJSONに設定する必要はありません。私はすでにこれを行い、それは動作します。しかし、dataTypeを使用する方が安全ですか? –

答えて

1

ユーザーの入力が(潜在的に)危険であると常に考えてください。整数が必要な場合は、実際に整数であることを確認してください。クライアント側の検証ではセキュリティが保証されません。私はまだあなたが望むパラメータを提供して、エンドポイントにPOST requestを作ることができます。

私はバックエンドのformdata配列をループしません。パラメータの数がプレースホルダの数を足していない場合は、プリペアドステートメントを破る可能性があります。

それで、あなたはうまくやっていた:

$data = $_POST['formdata']; 

$params = [ 
    ':artNr' => intval($data['artNr']), 
    ':etc' => htmlspecialchars($data['etc']), 
]; 

をまた、文字列としてフォーム要素の集合をエンコードするためにjQueryのserializeメソッドを使用します。フォームの値を取得する方が効率的です。

var $form = $('#myForm'); 

$form.submit(function(event) { 
    var request = $.post('https://endpoint.com', $form.serialize()); 

    request 
     .done(function(data) { 
      console.log('Done', data); 
     }) 
     .fail(function(error) { 
      console.log('Request fail', error); 
     }); 

    event.preventDefault(); 
}); 

このように、各.formdata要素をループする必要はありません。

+0

ありがとうございます。私はこれを調べます。私は通常のHTMLフォームを使用していません。私はページをリロードすることを心配していません。 DIVで.serializeを使用することは可能ですか? –

+1

フォームに 'div'を使ってハッキングを開始しないでください。' e.preventDefault() 'を使ってデフォルトアクションが引き起こされないようにするだけです。私は私の答えを更新します。 – JasonK

+0

なぜvarの前に "$"があるのですか? $ form –

関連する問題