如何针对SQL注入和其他威胁改进PHP代码

-1 php sql sql-injection

如何修改此代码以提高对sql注入和其他威胁的防护?它是一个MS SQL数据库.

<?php include_once("db.php"); ?>

<?php
$id = $_REQUEST['id'];
settype($id, 'string');

$tsql = "SELECT Table1.Fund FROM Table1 WHERE Table1.Fund='%s'";
$tsqlnew=sprintf($tsql, $id);

$stmt = sqlsrv_query( $conn, $tsqlnew);
if( $stmt === false)
{
echo "Error in query preparation/execution.\n";
die( print_r( sqlsrv_errors(), true));
}

$chd = '';

while( $data = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))  {
$chd .= '[\''.$data['Fund'] .'\'],';
}
$chd = substr($chd,0,-1);

?>
Run Code Online (Sandbox Code Playgroud)

我也想知道我的数据库连接是否可以改进.谢谢你的帮助!

<?php

$myServer = "server";
$myUser = "userPlaceHolder";
$myPass = "passwordPlaceHolder";
$myDB = "SQL";

$conn = sqlsrv_connect($myServer, array('UID'=>$myUser, 'PWD'=>$myPass, 'Database'=>$myDB));

if( $conn === false )
{
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
?>
Run Code Online (Sandbox Code Playgroud)

Mar*_*c B 6

你的代码确实没有任何东西来防止注入攻击.仅仅强制变量具有字符串数据类型就像一张卫生纸对海啸提供的保护一样多.

要防止注入攻击,您必须转义插入查询字符串的所有数据,无论是用户提供的还是您自己创建/插入的数据.

最好的选择是使用预准备语句,这样可以减轻您逃避数据的责任.

即使插入的数据不是"恶意的",任何SQL元字符(特别是引号)仍然可以破坏查询并导致语法错误.