Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这安全吗?ADOdb编写的声明_Php_Sql Server_Adodb - Fatal编程技术网

Php 这安全吗?ADOdb编写的声明

Php 这安全吗?ADOdb编写的声明,php,sql-server,adodb,Php,Sql Server,Adodb,我正在使用ADOdb连接到我的MSSQL数据库。我想知道这是否足以防止SQL注入 我正在使用的准备好的查询是: $db = ADONewConnection('odbc_mssql'); $dsn = "Driver={SQL Server};Server=SERVNAME;Database=DBNAME;"; $ADODB_COUNTRECS = false; $db->Connect($dsn,'LOGIN','PASS');

我正在使用ADOdb连接到我的MSSQL数据库。我想知道这是否足以防止SQL注入

我正在使用的准备好的查询是:

       $db = ADONewConnection('odbc_mssql');
       $dsn = "Driver={SQL Server};Server=SERVNAME;Database=DBNAME;";
       $ADODB_COUNTRECS = false;

       $db->Connect($dsn,'LOGIN','PASS');

       $sql = 'SELECT login, etc FROM users WHERE login ='.$db->Param('0').' AND pass ='.$db->Param('1').'';
       $stmt = $db->Prepare($sql);  
       $stmt = $db->Execute($stmt,array("$user_id","$psw"));

或者你会建议改用PDO吗?

我不明白为什么没有人试图回答这个问题,甚至没有人以任何方式发表评论。因此,我猜它以神秘的方式运作……)无论如何,我已经做了足够多的研究(我想是的),能够自己回答这个问题,并且有一定的信心

所以本质上,准备好的查询比输入转义安全得多,比如
mysql\u real\u escape\u string(),因为正如一些智者所说:

是的,mysql\u real\u escape\u string实际上只是一个字符串转义函数。这不是一颗神奇的子弹。它所能做的就是转义危险字符,以便在单个查询字符串中安全使用这些字符。但是,如果您没有事先对输入进行消毒,那么您将容易受到某些攻击向量的攻击

链接至完整答案:

所以我做了些什么来测试我准备好的语句和转义——我制作了一个简单的提交表单,并尝试用
mysql\u real\u escape\u string()清理输入
当然失败了,例如
“1或1=1”
,一些人建议在单引号中添加转义值,如下所示:

$query=“从mydb中选择*,其中ID=”。$escapedID。“”

它有助于防止出现
“1或1=1”
示例,但这肯定不是最佳做法。转义的问题在于它不能防止人们以恶意方式更改您的查询逻辑

所以从现在起,我将坚持使用ADODB准备的语句。就像我上面原始问题中的那个,或者是网站上的一个简短版本:

关于SQL注入的其他非常有用的问题:

同时观看此视频,它使SQL注入更容易掌握:


根据你的推理,不能说你正确理解了这件事。1.单引号不是用来保护的。如果没有它们,您的示例查询将失败(假设一个健全的
名称
字段将包含一些字母)。2.如果适用,转义将“防止人们以恶意方式更改您的查询逻辑”。3.我不知道ADODB准备好的语句下有什么,但我怀疑这是同样好的转义(至少为了兼容性)。4.没有一个好的实践示例演示了必须动态添加字段名的情况。请不要将其视为冒犯。我专注于这件事,而不是外表。如果你觉得某些措辞不礼貌,那不是故意的。我不介意建设性的批评:)1。你是对的,我错了,应该是身份证而不是名字。2.关于逃跑,这些不是我的结论,看幻灯片47。3.我也不知道,但我一直认为准备好的查询的执行方式与常规查询略有不同。4.对于动态插入字段名,我将使用“白名单”方法,正如同一视频“SQL注入神话和谬误”所建议的那样,也许我应该包括一个示例。有本机准备的语句和模拟语句。PDO默认使用模拟,我怀疑ADODB也有同样的行为。您能推荐一些阅读材料或视频吗?还有,你对如何改进我的答案有什么想法吗?
   $dbConnection = NewADOConnection($connectionString); 
   $sqlResult =  $dbConnection->Execute( 
   'SELECT user_id,first_name,last_name FROM users WHERE username=? AND password=?'
   , array($_POST['username'], sha1($_POST['password']) );