在 PHP 中使用 sqlsrv 防止 SQL 注入

Dew*_*ewD 1 php sqlsrv

我对整个 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);

?>
Run Code Online (Sandbox Code Playgroud)

我预计 SQL 注入在尝试时会失败。

Abr*_*ver 6

使用参数化查询非常简单,只需注意?

$sql = "SELECT * FROM Errors WHERE Error LIKE ? OR Description LIKE ?";
Run Code Online (Sandbox Code Playgroud)

然后构建一个添加 LIKE 通配符的参数数组%

$params = array("%$tech%", "%$tech%");
Run Code Online (Sandbox Code Playgroud)

带参数执行:

$stmt = sqlsrv_query( $conn, $sql, $params);
Run Code Online (Sandbox Code Playgroud)

或者,为了灵活地处理其他查询,对于参数,您可以执行以下操作:

$tech = "%$tech%";
$params = array($tech, $tech);
Run Code Online (Sandbox Code Playgroud)