给出以下查询(在代码中,不是存储过程);如何在查询中添加参数,而不是直接在查询中包含条件值?换句话说:如何使这个数据库调用安全?
$dbhandle = mssql_connect($myServer, $myUser, $myPass);
$selected = mssql_select_db($myDB, $dbhandle);
$query = "SELECT lastname, firstname, address, phone, email ";
$query .= " FROM person";
$query .= " WHERE lastname LIKE '" . $lastName . "'";
$result = mssql_query($query);
while($row = mssql_fetch_array($result)) {
... etc.
答案 0 :(得分:2)
使用PDO使其安全
答案 1 :(得分:1)
首先放弃过时的扩展程序并改为使用sqlsrv
:
这些功能允许您访问MS SQL Server数据库。
此扩展程序不再适用于使用PHP 5.3或Windows的Windows 后面。
SQLSRV是Microsoft提供的另一种MS SQL驱动程序: »http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx。
之后,您将获得准备好的声明支持:
$dbh = sqlsrv_connect ($serverName, $credentials);
$stmt = sqlsrv_prepare($dbh, 'SELECT lastname,firstname,address,phone,email FROM person WHERE lastname LIKE ?', array(&$lastName));
if(sqlsrv_execute($stmt))
{
while(false !== ($row = sqlsrv_fetch_array($stmt)){
// do stuff with $row
}
}
当然,如果我是,我会使用PDO,因为其他人建议使用相同的接口向所有数据库提供它支持的扩展。
如果由于某种原因您使用mssql
卡住了,那么我相信您也会手动转义所有查询参数。
答案 2 :(得分:0)
您需要的是准备好的声明(或者只是允许您参数化查询的DAL!)。一种选择是使用PDO,特别是使用PDO_SQLSRV
驱动程序..
执行此操作时,您可以以参数化形式准备查询,并在查询时传递它们,例如..
$conn = new PDO("sqlsrv:Server=$myServer;Database=$myDB", $myUser, $myPass);
$stmt = $conn->prepare('SELECT lastname,firstname,address,phone,email FROM person WHERE lastname LIKE ?');
$stmt->execute(array($lastname));
$result = $stmt->fetchAll();
foreach ($result as $row) {
...
(注意上面的代码应该是就地替换,但是未经测试!)
如果您的查询中有很多参数,最好使用命名参数,以便更好地跟踪它们。