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);
答案 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()”代替,虽然它有点丑陋(并不包含所有内容)