-1

それらの使用方法を適切に説明しているドキュメントが見つかりません。クエリから変数を取得して使用する方法と、クエリに対するパラメータの意味は? Web サイトを SQL インジェクションから安全にしたいのですが、次のコードを安全のために最適化する方法がわかりません。SQL インジェクションの仕組みは理解していますが、準備されたステートメントの作成方法やクエリの取得方法がわかりません。

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$tempProf = $_POST["professor"];
$tempProfArray = explode("=",$tempProf);
$prof = $tempProfArray[1];

$tempName = $_POST["name"];
$tempNameArray = explode("=",$tempName);
$name = $tempNameArray[1];

$tempNum = $_POST["number"];
$tempNumArray = explode("=",$tempNum);
$num = $tempNumArray[1];

$tempSec = $_POST["section"];
$tempSecArray = explode("=",$tempSec);
$section = $tempSecArray[1];

$tempCat = $_POST["category"];
$tempCatArray = explode("=",$tempCat);
$category = $tempCatArray[1];

$con=mysqli_connect("localhost","root","*******","******");

$result = mysqli_query($con,"SELECT * FROM professors where id='$prof'");
$row = mysqli_fetch_array($result);



if(empty($prof) || empty($name) || empty($num) || empty($section) || empty($category))
{
    echo "emptyField";
}
elseif(!is_numeric($num)  || !is_numeric($section))
{
    echo "NaN";
}
elseif(empty($row))
{
    mysqli_query($con,"INSERT INTO classes (className, classNumber, section, classCategory)
    VALUES ('$name','$num','$section','$category')");

    $classTemp = mysqli_query($con,"SELECT id FROM classes where className='$name' and classNumber='$num' and section ='$section'");
    $classTempArray = mysqli_fetch_array($classTemp);
    $classId = $classTempArray['id'];

    mysqli_query($con,"INSERT INTO professors (name, classes) VALUES ('$prof','$classId')");

    $profTemp = mysqli_query($con,"SELECT id FROM professors where name='$prof'");
    $profTempArray = mysqli_fetch_array($profTemp);
    $profId = $profTempArray['id'];
    mysqli_query($con,"UPDATE classes SET professor = '$profId' WHERE id = '$classId'");
    echo "success";
}
else
{
    $profName = $row['id'];
    mysqli_query($con,"INSERT INTO classes (professor, className, classNumber, section, classCategory)
    VALUES ('$prof', '$name','$num','$section','$category')");
    echo "success";
}

?>
4

2 に答える 2

1

一般に、このようなもので十分です(私は、あなたのような手続き型ではなく、接続にアクセスするオブジェクト指向の方法を使用していることに注意してください)

$stmt = $con->prepare( 'INSERT INTO classes (professor, className, classNumber, section, classCategory) VALUES (?, ?, ?, ?, ?)' )
$stmt->bind_param( 'ssiss', $prof, $name, $num, $section, $category );
$stmt->execute();

この場合、$num 以外はすべて文字列であり、$num は整数であると想定しています。

パラメータをバインドするための関連ドキュメントは次のとおりです。 http://www.php.net/manual/en/mysqli-stmt.bind-param.php

于 2013-08-31T03:09:30.857 に答える
-1
$sql="SELECT id FROM classes WEHERE className=? AND classNumber=? AND section =?";

$stmt =$con->prepare($sql);

$stmt->execute(array($name,$num,$ection));

//you can apply this for other queries
于 2013-08-31T03:13:55.160 に答える