web-dev-qa-db-ja.com

mysqli_real_escape_stringは安全ですか?

私はPHP=の新人であり、phpフォーム(ユーザーとパスのテキスト入力を使用)を使用したデータベース接続は完全に安全ではないことに気づきました。

これは機能していましたが、安全ではありませんでした:

<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$_POST['usuario'].'" 
        AND pass="'.$_POST['usuario'].'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

それで、私はmysqli_real_escape_stringについて読み、それを試すことにしました:

<?php    
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

これは正しいです?これは、mysqli_real_escape_stringの使用方法の良い例ですか?

14
Rosamunda

これは正しいです?

はい。

これは、mysqli_real_escape_stringの使用方法の良い例ですか?

番号

この関数を使用する場合は、内部関数にカプセル化する必要があり、アプリケーションコードから直接呼び出す必要はありません。クエリでデータを表すには、代わりにplaceholderを使用する必要があります。

$sql='SELECT * FROM usuarios WHERE username=? AND pass=?';

そして、プレースホルダーマークの処理時に、この関数mayが適用されます(該当する場合)が、それ自体ではなく、すべてのフォーマットルールに従って適用されます。

19

はい、保存して使用します。

Mysqliを使用する良い点は、オブジェクト指向であることです。したがって、次のように使用できます。

<?php

$mysqli = new mysqli("Host", "user", "password", "database");

$usuario = $mysqli->real_escape_string($_POST["usuario"]);
$clave = $mysqli->real_escape_string($_POST["clave"]);

$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';

$mysqli->query($sql);

$mysqli->close();
?>

または、PDOを使用できます。

7
Aartsie

Mysqli()関数の使用は、フレームワーク開発者およびそれがもたらす可能性のあるすべての安全性の問題を認識している他の人にのみ予約してください。他のすべての人には、 [〜#〜] pdo [〜#〜] があります。 mysqli()と同じくらい簡単に使用でき、はるかに安全です。

6
Ermir