Предотвращение SQL-инъекций с использованием sqlsrv в PHP - PullRequest
0 голосов
/ 15 января 2019

Я очень плохо знаком со всем кодированием PHP / MSSQL и мне нужна помощь по предотвращению SQL-инъекций.

Я добавляю функцию простого поиска на веб-сайт, который использует базу данных MSSQL. Код работает так, как я хочу, но он уязвим для SQL-инъекций.

Есть ли другой способ обеспечить это, кроме как подготовить заявления?

Я также не очень хорошо знаком с хранимыми процедурами.

Я пытался подготовить заявления без удачи (если я не делаю что-то не так, это, скорее всего)

Хранимые процедуры, с которыми я не знаком.

<?PHP

$tech = (isset($_POST['Technician'])? $_POST['Technician'] : null);

$sql = "SELECT * FROM Errors WHERE Error LIKE '%$tech%' or Description LIKE '%$tech%'";

$name = trim($_POST['Technician']);

if(empty($name)){
    print '<script type="text/javascript">alert("Please enter an Error Code or Error Description")</script>';
    exit;
}

$stmt = sqlsrv_query($conn, $sql);

if ($stmt) {
    $rows = sqlsrv_has_rows( $stmt );

    if ($rows === true) {
        echo "";
    } else{
        echo '<script type="text/javascript">alert("Please enter a valid Term")</script>';
    }
}  

while($db_field = sqlsrv_fetch_array($stmt)){
    print '<table align="center" style="position: relative; width:250px; text-align: center;">';
    print '<tr>';
    print '<td><a href="result.php?Error=' . $db_field['Error'] . '">'.$db_field['Error']."</a></td></tr>";
    print "<tr>";
    print '<td>'.$db_field['Description'].'</td></tr>';
    //print "<tr><th>"."Cause"."</th>";
    //print "<td>".$db_field['Cause']."</td></tr>";
    //print "<tr><th>"."Resolution"."</th>";
    //print "<td>".$db_field['Resolution']."</td></tr>";
    print "</table><br>";
}

sqlsrv_close($conn);

?>

Я ожидаю, что SQL-инъекция потерпит неудачу при попытке.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Подготовленные операторы - это самый простой способ ввести необработанный ввод в SQL. Вы можете вообще пропустить их, если хотите, но это достигается ценой большей сложности и меньшей безопасности (и вам нужно написать альтернативный код самостоятельно). Единственная причина, по которой вы можете найти функции escape() в других расширениях (или вообще без механизма!), Заключается в том, что они являются устаревшими библиотеками, иногда очень старыми. SQLSRV достаточно современен.

Кроме того, вы можете:

Результирующий код будет выглядеть так:

$tech = filter_input(INPUT_POST, 'Technician');
if ($tech !== null) {
    $sql = "SELECT *
        FROM Errors
        WHERE Error LIKE ? or Description LIKE ?";
    $find = '%' . escapeLike($tech) . '%';
    $params = [$find, $find];
    $res = sqlsrv_query($conn, $sql, $params);
}

function escapeLike($value)
{
    return strtr($value, [
        '%' => '[%]',
        '_' => '[_]',
        '[' => '[[]',
    ]);
}
0 голосов
/ 15 января 2019

Довольно просто использовать параметризованный запрос, только уведомление ?:

$sql = "SELECT * FROM Errors WHERE Error LIKE ? OR Description LIKE ?";

Затем создайте массив параметров, добавив подстановочные знаки LIKE %:

$params = array("%$tech%", "%$tech%");

Выполнить с параметрами:

$stmt = sqlsrv_query( $conn, $sql, $params);

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

$tech = "%$tech%";
$params = array($tech, $tech);
...