2016-06-01 12 views
1

URL(GET)から変数を受け取って使用する必要があります。それはちょうど数字(0から400まで)で、その値を使ってクエリを実行します。このPHPコード(MySQLクエリを含む)は安全ですか?

私はmysqli_real_escape_string()を使用し、IF:if($ id> 0および$)を使用して、何か間違ったことをしないように(SQLインジェクションなど何か、私はセキュリティの専門家ではありません) id < 400)

あなたはそれが十分だと思いますか?コード全体は以下の通りです。ありがとう!

if($_SERVER["REQUEST_METHOD"] == "GET") { 
     // id enviado desde GET 

    $id = mysqli_real_escape_string($db,$_GET['id']); // $db es la conexión MySQL 
    if($id > 0 and $id < 400) { 
     $sql = "SELECT url FROM urls WHERE id = '$id'"; // Traemos la primera URL del id correspondiente 
     $result = mysqli_query($db,$sql); 
     echo "Cantidad de rows devueltas x la consulta SQL:" ; 
     echo mysqli_num_rows($result); 
     echo "<br>"; 

     while ($row = mysqli_fetch_array($result)) { 
       echo $row[0]; 
       echo "<br>"; 
     } 
    } 
    } 
+6

を使用して、それがより安全に保存されますバインド変数を使用した準備済みの文 - [ここにあなたのコードでの問題のデモンストレーション](https://3v4l.org/c15DS) –

+0

IDの場合、エスケープする必要はありません。代わりにis_numeric()を使用して確認してください。 –

+4

**いいえ**これは**安全ではありません**。 *コードとして実行する前にユーザー入力を変更する*は、最初にコードとして実行しない*より安全ではありません。いくつかの例:http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string * code *の代わりに* data *としてユーザー入力を処理する方法は、SQLから保護する方法です注入。クエリパラメータを使用します。 – David

答えて

0

mysqli_real_escape_stringは良いのですが、あなたは時々あなたのデシベルに特殊文字を挿入するための準備された文は、優れている:

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

このコースのSQLインジェクションが

関連する問題