PHP和SQL Server,如何使其安全?

时间:2011-07-25 23:30:22

标签: php sql-server lamp

http://www.php.net/manual/en/book.mssql.php

我正在使用它从LAMP环境连接到SQL Server。我注意到我没有像prepare statement和real_escape_string这样的neet函数。

如何让我的查询尽可能安全?任何帮助表示赞赏。

不建议我使用ODBC或PDO,我没有这个选项。我必须运行我拥有的东西,那就是MSSQL。

$con = mssql_connect ('xxx', 'xxx', 'xxx');

mssql_select_db('xxx', $con);

$qry = "SELECT 
            firstname
    FROM 
            person
    where firstname = '{$firstname}'";

$query = mssql_query($qry, $con);

4 个答案:

答案 0 :(得分:2)

不要使用文字,使用参数和bind来查询:

$con = mssql_connect ('xxx', 'xxx', 'xxx');
mssql_select_db('xxx', $con);
$qry = 'SELECT firstname
     FROM person
    where firstname = @firstname';
mssql_bind ($qry, '@firstname', $firstname, SQLVARCHAR);
$query = mssql_query($qry, $con);

答案 1 :(得分:1)

答案 2 :(得分:1)

您可以使用htmlentities()将html元素转换为html实体,此函数接受第三个参数,用于转义单引号和双引号。

这是函数的签名:

string htmlentities ( string $string [, int $flags = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]] )

以及第二个参数可能采用的参数:

ENT_COMPAT 将转换双引号并单独保留单引号。

ENT_QUOTES 会转换双引号和单引号。

ENT_NOQUOTES 会保留双引号和单引号未转换。

ENT_IGNORE 无声地丢弃无效的代码单元序列,而不是返回空字符串。在PHP 5.3.0中添加。这是为了向后兼容而提供的;避免使用它,因为它可能有安全隐患。

您只需将addslashes()htmlentities()

一起使用即可

还有另一个函数可以清除filter_var ()字段中的html标签,例如:

$ return_value = filter_var($data_to_be_filtered,FILTER_SANITIZE_STRING);

重要

不要忘记检查是否启用了magic_quotes。你可以写下:

if(get_magic_quotes_gpc())
    //do something

有关magic_quotes的更多信息:http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc

修改

您可以使用预准备语句执行更安全的事务。它们阻止了SQL注入。

示例代码:

$db = new mysqli();
$db->real_connect($host,$username,$password,$db) or die("Cannot connect");
$query = "select name from users where id = ?";
$st = $db->prepare($query); //faster than normal query run
$st->bind_param("d",$id);
$st->execute();
$st->bind_result($name);
$st->fetch();
echo $name;

答案 3 :(得分:0)

Mssql不提供转义查询的函数。一种选择是使用“addslashes()”代替,虽然它有点丑陋(并不包含所有内容)

这可能会有所帮助:How to escape strings in SQL Server using PHP?