Protezione dell'iniezione SQL per i miei file PHP [chiuso]

0

Ho creato un forum PHP. Ho usato PDO, oltre a SQLi. Quando ho eseguito una scansione di sicurezza del mio sito Web, ha rilevato errori e, dopo un lungo periodo di tentativi diversi, non riesco a risolverli.

Indica a chi mi aiuta a risolverli.

Ho ricevuto i seguenti errori:

injection sql Input di classificazione: errore di convalida
Risorsa: view_topic.php Parametro: id
Metodo: GET

injection sql Input di classificazione: errore di convalida
Risorsa: add_answer.php
Parametro: a_email
Parametro: a_answer
Parametro: a_name
Parametro: id
Metodo: GET

Overte intero Classificazione: errore di condizione al contorno
Risorsa: view_topic.php? Id = 2147483647
Parametro: id
Metodo: GET

Overte intero Classificazione: errore di condizione al contorno
Risorsa: view_topic.php? Id = 2147483647
Parametro: id
Metodo: GET

Script cross-site
Classificazione: errore di convalida dell'input
Risorsa: view_topic
Risorsa: /add_answer.php
Parametro: id
Metodo: GET

FILE PHP
add_answer.php

<?php

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="linux"; // Mysql password 
$db_name="simpleFourm"; // Database name 
$tbl_name="fanswer"; // Table name 

// Create connection
$conn = new mysqli($host, $username, $password, $db_name);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}


// Get value of id that sent from hidden field 
$id=$_POST['id'];

// Find highest answer number. 
$sql="SELECT MAX(a_id) AS Maxa_id FROM $tbl_name WHERE question_id='$id'";
$result = $conn->query($sql); 

$rows=mysqli_fetch_array($result);

// add + 1 to highest answer number and keep it in variable name "$Max_id". if there no answer yet set it = 1 
if ($rows) {
$Max_id = $rows['Maxa_id']+1;
}
else {
$Max_id = 1;
}

// get values that sent from form 
$a_name=$_POST['a_name'];
$a_email=$_POST['a_email'];
$a_answer=$_POST['a_answer']; 

$datetime=date("d/m/y H:i:s"); // create date and time

// Insert answer 
$sql2="INSERT INTO $tbl_name(question_id, a_id, a_name, a_email, a_answer, a_datetime)VALUES('$id', '$Max_id', '$a_name', '$a_email', '$a_answer', '$datetime')";
$result2 = $conn->query($sql2); 

if($result2){
echo "Successful<BR>";
echo "<a href='view_topic.php?id=".$id."'>View your answer</a>";

// If added new answer, add value +1 in reply column 
$tbl_name2="fquestions";
$sql3="UPDATE $tbl_name2 SET reply='$Max_id' WHERE id='$id'";
$result3 = $conn->query($sql3); 

}
else {
echo "ERROR";
}

// Close connection
$conn->close();
?>

view_topic.php

<?php

$host="localhost"; // Host name 
$username="root"; // Mysql username 
$password="linux"; // Mysql password 
$db_name="simpleFourm"; // Database name 
$tbl_name="fquestions"; // Table name 

// Create connection
$conn = new mysqli($host, $username, $password, $db_name);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// get value of id that sent from address bar 
$id=$_GET['id'];
$sql="SELECT * FROM $tbl_name WHERE id='$id'";
$result = $conn->query($sql); 

$rows=mysqli_fetch_array($result);
?>

<table width="400" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td><table width="100%" border="0" cellpadding="3" cellspacing="1" bordercolor="1" bgcolor="#FFFFFF">
<tr>
<td bgcolor="#F8F7F1"><strong><?php echo $rows['topic']; ?></strong></td>
</tr>

<tr>
<td bgcolor="#F8F7F1"><?php echo $rows['detail']; ?></td>
</tr>

<tr>
<td bgcolor="#F8F7F1"><strong>By :</strong> <?php echo $rows['name']; ?> <strong>Email : </strong><?php echo $rows['email'];?></td>
</tr>

<tr>
<td bgcolor="#F8F7F1"><strong>Date/time : </strong><?php echo $rows['datetime']; ?></td>
</tr>
</table></td>
</tr>
</table>
<BR>

<?php

$tbl_name2="fanswer"; // Switch to table "forum_answer"
$sql2="SELECT * FROM $tbl_name2 WHERE question_id='$id'";
$result2  = $conn->query($sql2);

if ($result2->num_rows > 0) {
    // output data of each row
    while($rows = $result2->fetch_assoc()) {
?>

<table width="400" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td><table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td bgcolor="#F8F7F1"><strong>ID</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_id']; ?></td>
</tr>
<tr>
<td width="18%" bgcolor="#F8F7F1"><strong>Name</strong></td>
<td width="5%" bgcolor="#F8F7F1">:</td>
<td width="77%" bgcolor="#F8F7F1"><?php echo $rows['a_name']; ?></td>
</tr>
<tr>
<td bgcolor="#F8F7F1"><strong>Email</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_email']; ?></td>
</tr>
<tr>
<td bgcolor="#F8F7F1"><strong>Answer</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_answer']; ?></td>
</tr>
<tr>
<td bgcolor="#F8F7F1"><strong>Date/Time</strong></td>
<td bgcolor="#F8F7F1">:</td>
<td bgcolor="#F8F7F1"><?php echo $rows['a_datetime']; ?></td>
</tr>
</table></td>
</tr>
</table><br>

<?php
  }
} else {
    echo "<font color='red'>0 results</font>" ; 

}


$sql3="SELECT view FROM $tbl_name WHERE id='$id'";
$result3 = $conn->query($sql3);

$rows=mysqli_fetch_array($result3);


$view=$rows['view'];

// if have no counter value set counter = 1
if(empty($view)){
$view=1;

$sql4="INSERT INTO $tbl_name(view) VALUES('$view') WHERE id='$id'";
$result4 = $conn->query($sql4);

}

// count more value
$addview=$view+1;
$sql5="update $tbl_name set view='$addview' WHERE id='$id'";
$result5  = $conn->query($sql5);
$conn->close();
?>

<BR>
<table width="400" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" action="add_answer.php">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td width="18%"><strong>Name</strong></td>
<td width="3%">:</td>
<td width="79%"><input name="a_name" type="text" id="a_name" size="45"></td>
</tr>
<tr>
<td><strong>Email</strong></td>
<td>:</td>
<td><input name="a_email" type="text" id="a_email" size="45"></td>
</tr>
<tr>
<td valign="top"><strong>Answer</strong></td>
<td valign="top">:</td>
<td><textarea name="a_answer" cols="45" rows="3" id="a_answer"></textarea></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="id" type="hidden" value="<?php echo $id; ?>"></td>
<td><input type="submit" name="Submit" value="Submit"> <input type="reset" name="Submit2" value="Reset"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
    
posta Andrew Kralovec 24.07.2015 - 16:02
fonte

1 risposta

3

Quando parli di SQL injection, indipendentemente dalla lingua, dovresti usare le query parametrizzate. Questi costruiscono un piano di query prima del tempo, piuttosto che quando l'utente fornisce input, quindi un utente malintenzionato non può facilmente modificare il funzionamento della query.

PHP supporta questo, ma è necessario utilizzare la libreria PDO piuttosto che le funzioni mysqli . link per ulteriori informazioni. Richiede più lavoro rispetto alle semplici query con mysqli, ma ottieni la protezione SQLi usando le query parametrizzate, ed è una buona pratica iniziare.

In secondo luogo, non dovresti usare l'utente root di MySQL per collegarti al tuo database. Le pratiche di difesa approfondite includono l'esecuzione di un'applicazione con il minor numero di autorizzazioni necessario. E spero davvero che non sia la tua password di root per il tuo database.

    
risposta data 24.07.2015 - 16:13
fonte

Leggi altre domande sui tag