GEM*_*EMI 4 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');
$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"));
Run Code Online (Sandbox Code Playgroud)
或者您可能会建议切换到PDO?
我不明白为什么没有人试图回答这个问题,甚至以任何方式发表评论.所以我猜想这会以神秘的方式运作......;)无论如何,我已经研究了足够的(我想是这样的)能够以一定程度的自信来回答这个问题.
因此,实质上准备好的查询比输入转义更安全,例如mysql_real_escape_string();,因为正如一些有智慧的人所说:
是的,mysql_real_escape_string实际上只是一个字符串转义函数.它不是一个神奇的子弹.它所做的只是逃避危险的字符,以便在单个查询字符串中使用它们是安全的.但是,如果您事先没有对输入进行消毒,那么您将容易受到某些攻击媒介的攻击.
链接到完整答案:mysql_real_escape_string
那么我做了什么来测试我准备好的语句vs转义 - 我已经做了一个简单的提交表单并尝试清理输入,mysql_real_escape_string();当然它失败了例子"1 OR 1=1",有些人建议在单引号中添加转义值,如:
$ query ="SELECT*FROM mydb WHERE ID ='".$ escapedID."'";
它有助于防止这个"1 OR 1=1"例子,但肯定这不是最好的做法.转义的问题在于它无法防止人们以恶意方式更改您的查询逻辑.
所以从现在开始,我将坚持ADODB准备好的陈述.就像上面我原来问题中的那个,或者来自bobby-tables网站的更短版本:
$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']) );
Run Code Online (Sandbox Code Playgroud)
关于SQL注入的其他非常有用的问题:
另外观看这个视频,它使SQL注入更容易掌握:
| 归档时间: |
|
| 查看次数: |
5026 次 |
| 最近记录: |