2014-11-10 2 views
-5

Я застрял, думая о том, как я могу избежать атак SQL-инъекций на мой код.Как я могу избежать SQL-инъекций в моем коде ниже?

Это то, что у меня есть сейчас.

<?php 
session_start(); 
$email = $_POST['e-mail']; 
$fn = $_POST['firstname']; 
$ln = $_POST['lastname']; 
$cp = $_POST['cellphone']; 
$phn = $_POST['phone_number']; 
$comp = $_POST['company']; 
$prov = $_POST['province']; 
$brgy = $_POST['barangay']; 
$fadd = $_POST['address']; 
$sadd = $_POST['address2']; 

$conn = mysqli_connect('localhost','root','','newcartdb')or die('Could not connect'); 

foreach($_POST['product'] as $product) 
{ 
    $date = date('Y-m-d H:i:s'); 
    $order_name = $product['item_name']; 
    $order_code = $product['item_code']; 
    $order_qty = $product['item_qty']; 
    $sub_total = $product['price']; 

    $query = "INSERT INTO `newcartdb`.`orders`(`Email`,`Firstname`,`Lastname`,`ContactNum`,`PhoneNum`,`Company`,`Province`,`Barangay`,`FAddress`,`SAddress`,`ProductName`,`ProductCode`,`Qty`,`SubTotal`,`datetime`) VALUES('$email','$fn','$ln','$cp','$phn','$comp','$prov','$brgy','$fadd','$sadd','$order_name','$order_code','$order_qty','$sub_total','$date')"; 
    mysqli_query($conn,$query); 
} 



mysqli_close($conn); 

header('Location: order_confirmation.php'); 
?> 

Как я могу улучшить это?

+4

Почему вы не использовать средства поиска, чтобы найти информацию по своему усмотрению? Вы используете MySQLi, вы используете PHP, нетрудно найти «php mysqli sql injection Prevention». –

ответ

0

Как предложено, prepared statements - лучший способ достичь good защита от SQL-инъекции.

Укороченный Пример

Вам нужно будет добавлять записи, чтобы заполнить все столбцы, которые вы хотите вставить.

$email = $_POST['e-mail']; 
$fn = $_POST['firstname']; 
$ln = $_POST['lastname']; 

    if ($stmt = $mysqli->prepare("INSERT INTO `newcartdb`.`orders`(Email,Firstname,Lastname) values(?,?,?)) { 
     $stmt->bind_param("sss", $email, $fn, $ln); 

"SSS" - представляет собой тип данных т.е. "S" - строка, "я" - целое число для каждой записи.

значения (?,?,?) - это заполнитель для оператора bind_params, поэтому '?' будут заменены в последовательном порядке со значениями вы размещаете в методе bind_params

 $stmt->execute(); 

     $_SESSION['notice'] = "Table updated"; 
    } 

    else{ 
     $_SESSION['notice'] = "Table could not be updated!"; 
    } 
+0

Сэр, что вы подразумеваете под (?,?,?). Мне нужно что-то там положить? переменные или мне нужно ввести его таким образом? :) –

+0

С подготовленными заявлениями? являются заполнителями, когда команда выполняется, она принимает элементы i.e («sss», $ email, $ fn, $ ln); и замените '?' в последовательном порядке с переменными, помещенными в метод bind_params, так что вам не нужно его заменять. –

+0

Ahhh. Я понял. если у меня есть 7 переменных, то я должен поставить 7 вопросительных знаков там? Теперь я знаю, почему это? для хакера это не знать. : D Я узнал сегодня! wuhuu !!! Спасибо, сэр @ Stacker-flow. –

Смежные вопросы