【问题标题】:Are these MYSQL/SQL statements safe from SQL injection? [duplicate]这些 MYSQL/SQL 语句对 SQL 注入安全吗? [复制]
【发布时间】:2013-03-17 15:42:22
【问题描述】:
////MYSQL Statement////
$sql = $mysql_conn->prepare("UPDATE table SET columnname = ? WHERE id = ?";
$sql->execute(array($new_value,$id));


////SQL Statment////
$client_select = array($select);
$tsql1 = "SELECT * FROM customertable where id = ?";
$result1 = sqlsrv_query($conn, $tsql1,$client_select);
$row1 = sqlsrv_fetch_array($result1, SQLSRV_FETCH_ASSOC);

如果是的话,谁能给我详细说明为什么 MYSQL 比:

$sql = mysql_query("select * from customers where id='$id'");
$sql = mysql_fetch_assoc($sql);

【问题讨论】:

  • 其他数千个问题的重复...
  • 因为当您使用准备好的语句时,它会根据它们的类型(int/string/etc.)自动清理准备好的变量,mysql 函数不会。哦,@YourCommonSense 有一个非常有效的观点。
  • 我引用@YourCommonSense ---
  • 创建查询时,您必须正确格式化它的每个部分。不是因为什么“注射”,而是为了它。当你要在查询中插入一个字符串时,你必须把它放在引号中,否则你会得到一个语法错误。当你要在查询中插入一个字符串时,你必须转义这些用来分隔这个字符串的引号,否则你会得到一个语法错误。等等。您应该关心的是正确的格式,而不是关于注射的可怕故事。只要您根据其类型正确格式化每个动态查询部分

标签: php mysql sql sql-server sql-injection


【解决方案1】:

第二个选项

$sql = mysql_query("select * from customers where id='$id'");

不安全,因为 $id 可能类似于 ' OR 1=1 OR id=' 并且查询看起来像

"select * from customers where id='' OR 1=1 OR id=''

【讨论】:

  • 好的,但是为什么我不能在准备版本的执行部分中为 $id 值输入:' OR 1=1 OR id='?
  • 是的,你可以,这是一个例子。
【解决方案2】:

第一组是安全的。第二组没有。例如,如果用户要在 $id 字段中提供数据,例如:'1;从 Table1 中删除'

那么你的 SQL 语句会变成:

"select * from customers where id=1; delete from Table1"

如果你的 SQL 引擎可以执行多条语句,那你就有麻烦了。

【讨论】:

  • PHP 的mysql_query 不支持多语句。
【解决方案3】:

类似于您更安全的查询,这是我在一个类中使用的代码示例,但您应该明白:

$strSQL = "UPDATE user_table SET pname = ".$this->dbParam('a').", pname2 = ".$this->dbParam('b')."
            WHERE id = ".$this->pid;

$rs = parent::prepSQL($strSQL);
parent::doSQL($rs,array($a, $b));

这是一个类外的例子

$strSQL = "SELECT COUNT(*) FROM table_of_users WHERE login = ".$dbconn->Param('a')." AND guest_user = 0";
$rs = $dbconn->Prepare($strSQL);
$rs = $dbconn->Execute($rs,array($_POST["persnum_".$j]));

它更安全,因为它可以阻止人们注入自己的答案;其他人回答。它也更容易阅读,因为您不必单引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2014-01-28
    相关资源
    最近更新 更多