繁体   English   中英

在PHP中使用sqlsrv防止SQL注入

[英]Prevent SQL Injection using sqlsrv in PHP

我是整个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 Injection在尝试时失败。

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

$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);

准备语句是将原始输入注入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, [
        '%' => '[%]',
        '_' => '[_]',
        '[' => '[[]',
    ]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM