Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用sqlsrv防止SQL注入_Php_Sqlsrv - Fatal编程技术网

在PHP中使用sqlsrv防止SQL注入

在PHP中使用sqlsrv防止SQL注入,php,sqlsrv,Php,Sqlsrv,我对整个PHP/MSSQL编码非常陌生,需要SQL注入预防方面的帮助 我正在向使用MSSQL数据库的网站添加一个简单的搜索功能。 代码按照我的要求工作,但容易受到SQL注入的攻击 除了准备报表之外,还有其他方法可以确保它的安全吗 我对存储过程也不是很熟悉 我曾尝试过不走运地准备陈述(除非我做错了什么,这是最有可能的) 我不熟悉的存储过程 <?PHP $tech = (isset($_POST['Technician'])? $_POST['Technician'] : null); $

我对整个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 = "SELECT * FROM Errors WHERE Error LIKE ? OR Description 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, [
        '%' => '[%]',
        '_' => '[_]',
        '[' => '[[]',
    ]);
}

“除了准备声明之外,还有其他方法可以确保它的安全吗?”不是真的。使用预先准备好的报表有什么问题?如果您尝试过但失败了,请向我们展示并解释出现的问题,然后我们可以帮助您解决。请注意,使用prepared语句并不要求您使用存储过程,但同样地,使用存储过程并不能消除使用prepared语句的需要。@DewD要获得这样的代码输出,请在每行之前添加4个空格。我对你的问题进行了编辑,将其格式设置为“我试图准备陈述,但运气不佳”。你应该展示这一尝试,并描述结果/错误。强制性:就这么简单?@DewD yep:-)。关于这个话题,还有两份不同的官方文件。。。以及具体展示如何使用它们,类似于这个答案谢谢大家的帮助。非常感谢。