-6
////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);
4

3 に答える 3

2

2番目のオプション

$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=''
于 2013-03-27T14:09:01.810 に答える
0

最初のセットは安全です。2番目のセットはそうではありません。たとえば、ユーザーが次のように$idフィールドにデータを入力した場合: '1; 表1から削除

次に、SQLステートメントは次のようになります。

"select * from Customers where id = 1; delete fromTable1"

SQLエンジンが複数のステートメントを実行できるようなものである場合、問題が発生します。

于 2013-03-27T14:10:30.527 に答える
0

より安全なクエリと同様に、クラスで使用するコードの例を次に示しますが、次のようなアイデアが得られるはずです。

$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]));

人々が自分の答えを注入するのを防ぐので、より安全です。他の人はそれに答えます。また、一重引用符で囲む必要がないため、読みやすくなっています。

于 2013-03-27T14:10:42.077 に答える