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

时间:2011-09-27 19:59:50

标签: 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);

?>

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

<?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));
}
?>

1 个答案:

答案 0 :(得分:6)

您的代码完全 NOTHING 以防止注入攻击。仅仅强制变量具有字符串数据类型就像一张卫生纸在海啸中提供的保护一样。

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

最佳选择是使用prepared statements,这可以减轻您逃避数据的责任。

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