0

新しいサーバーに移動したため、古い php サイトを修正するタスクが割り当てられました。現在のサーバーは、グローバル化された変数を許可していません。それが、このサイトが実行されていたほとんどすべてです。画像をアップロードしようとすると、SQL ステートメントに、画像を追加するリスティングの ID 以外のすべてが表示されます。誰かがこれを理解するのを手伝ってくれることを望んでいました。

これは私のアップロード機能です:

function upload(){
global $imagefolder, $id;
global $tbl_units;

include "globalizePOSTGET.php";

// $uid = uuid();
$minsize = 5000;            // 5kb
$maxsize = 3000000;     // 3mb
$ext = explode('.',basename($_FILES['userfile']['name']));
$ext = $ext[count($ext)-1];
$ext = strtolower($ext);

if ($ext != "jpg" && $ext != "jpeg" && $ext != "png") {
    echo "<script> alert('Image is not a png or jpeg format'); </script>";
    return false;
}

$imagename = $_POST['id']."_img".$_FILES['img'].".$ext";
$imagename2 = "X_".$imagename;
$uploadfile = $imagefolder . $imagename;
$uploadfile2 = $imagefolder . $imagename2;
$uploadthumb = $imagefolder . "tn_" . $imagename;

if (file_exists($uploadfile)) unlink($uploadfile);
if (file_exists($uploadthumb)) unlink($uploadthumb);

if (file_exists($uploadfile)) { 
    echo "<script> alert('Image already exists!'); </script>";
}
else
{
    if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
        // check the file is less than the maximum file size
        if($_FILES['userfile']['size'] < $maxsize) {
            $imgData = addslashes(file_get_contents($_FILES['userfile']['tmp_name']));      // prepare the image for insertion
            $size = getimagesize($_FILES['userfile']['tmp_name']);          // get the image info..
            if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile2)) {
                $Image = @imagecreatefromjpeg($uploadfile2);
                if ($Image) {
                 $img_height = imagesy($Image);
                 $img_width = imagesx($Image);
                 imagedestroy($Image);
                }

                if ($img_height > $img_width) {         // portrait  
                    $tempMultiplier = 150 / $img_height;
                    $tempMultiplierFull = 600 / $img_height;
                } else {
                    $tempMultiplier = 150 / $img_width;
                    $tempMultiplierFull = 600 / $img_width;
                }

                $imageHeight = $img_height * $tempMultiplier;
                $imageWidth = $img_width * $tempMultiplier;
                $fullimageHeight = $img_height * $tempMultiplierFull;
                $fullimageWidth = $img_width * $tempMultiplierFull;
                createthumb($imagename2,"tn_".$imagename,$imageWidth,$imageHeight);

                if($_FILES['userfile']['size'] > $minsize) {
                    createthumb($imagename2,$imagename,$fullimageWidth,$fullimageHeight);
                    if (file_exists($uploadfile2)) unlink($uploadfile2);
                } else {
                    rename($uploadfile2, $uploadfile);
                }

                $sql = "UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id'];
                echo $sql;
                if(!mysql_query($sql)) {
                    echo "<script> alert('Unable to upload file'); </script>";
                } else {
                    ?> <script>location.replace('memonly.php?action=edit_record&id=<?php echo $id; ?>');</script> <?php
                }
            }
        }   else {
            // if the file is not less than the maximum allowed, print an error
            $file_n = basename($_FILES['userfile']['name']);
            $file_s = $_FILES['userfile']['size'];
            ?>
            <script> alert("File exceeds the maximum limit of <?php echo $maxsize; ?>\nFile <?php echo $file_n; ?> is <?php echo $file_s; ?>");</script>
            <?php
        }
    }
}
}

エラーが発生している行の sql ステートメントをエコーし​​ていると思います。送信をクリックすると、ページにUnable to upload file'. Which is why I echoed the sql there. I end up with a sql statement looking like this:UPDATE member_units SET photo = "_img.jpg" WHERE id = `と表示されます

誰か助けてください!私はPHPに非常に不慣れで、ここで何をすべきかわかりません。

アップロードを行っているフォームは次のとおりです。

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="hidden" name="_submit_check" value="1" /> 
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="hidden" name="img" value="<?php echo $img; ?>" />
Image URL: <input type="file" name="userfile" value=""  style="font-size: 10px; width: 100%;">
<input type="submit" value="Submit" onClick="return validate();">&nbsp;
<input type="button" value="Cancel" onClick="location.href='/memonly.php?action=edit_record<?php echo "&id=$id&memberid=$memberid"; ?>';">
</form>
4

2 に答える 2

2

この種の問題に対して最初に行う必要があるのは、問題が発生していると思われる場所を調べることです。だからあなたの反響文を取ってください...

UPDATE member_units SET photo = "_img.jpg" WHERE id = `

これに対応するのは...

UPDATE $tbl_units SET photo".$_FILES['img']." = \"" . $imagename . "\" WHERE id = " . $_POST['id'];

比較すると、 $_FILES['img'] が文字列に変換する限り、空の変数であることは明らかです。$_POST['id'] についても同じことが言えますが、$imagename は短い_img.jpgファイル名を与えます。

さかのぼってみると、$imagename の由来が...

$_POST['id']."_img".$_FILES['img'].".$ext";

これがあなたの写真 = "_img.jpg"の由来です。繰り返しますが、$_FILES['img'] と $_POST['id']

echo ステートメントに到達しているという事実は、何かがアップロードされていることを意味しますが、それは $_FILES['userfile'] 配列を介して行われ、関連するすべての変数を使用しています。たとえば、 $_FILES['userfile']['name' ] アップロードされている画像のファイル名が表示されます。

次に自問する必要があるのは、$_POST['id'] が欠落しているか空であるため、どこから来ると予想しているか、および HTML フォームのどのフィールドがその変数を提供しているかです。次に、命名システムで何を達成しようとしているのかを自問する必要があります。たとえば、画像ファイルを 1_imgLolCat.jpg のようにしたい場合は、変数をより似たものにする必要があります。

$imagename = $_POST['id']."_img".$_FILES['userfile']['name'];

ただし、以下の私の回答の最後の部分では、ファイル名の代わりに、実際に探しているのは、カテゴリまたは画像の種類を示す POST 変数であると思います。その場合、作業したい場合があります...

$imagename = $_POST['id']."_img".$_POST['img'].".$ext";

...「img」という名前の HTML フィールドが存在する場合

最後に、SQL ステートメントを見てください...

SET photo".$_FILES['img']." = \"" . $imagename . "\"

そして、あなたがやろうとしているように見えるのは、フォームから渡されたものに依存するテーブルに一意の変数を設定することであるため、テーブルを再確認してください。私はここで間違っているかもしれませんが、(上で述べたように) そこに $_POST['img'] が必要だと思います。

警告の言葉、必要があります...このような SQL ステートメントに入力する前に、これらの変数をサニタイズする必要があります。誰かが簡単に取ることができます

SET photo".$_POST['img']

データベースで使用する権限が設定されている場合は、テーブル全体を削除します。これを適切に行う方法については、他にもたくさんの答えがあります。:)

于 2013-02-27T23:45:15.240 に答える
0

HTMLフォームで「id」フィールドが送信されないようです。私はそれが隠された入力であるべきだと思いますか?

スクリプトが SQL インジェクションのターゲットになる可能性があることに注意してください。ユーザー入力 ($_POST['id']) を SQL クエリで直接使用します。この入力が実際に設定され、数値であるかどうかを確認する必要があります。

于 2013-02-27T23:28:20.587 に答える