Обычно я не делаю полный аудит кода, как это, но вот некоторые проблемы, которые я вижу с вашим кодом. Некоторые из них, возможно, связаны с вопросом, другие - это другие проблемы, которые я вижу.
Строка if(!empty($_FILES)){
должна быть if(isset($_FILES['uploadedfile'])){
. Это связано с тем, что если кто-то загрузит файл с другим именем в поле ввода, ваш код все равно будет работать, выдав несколько ошибок.
Мне неудобно с этой строкой:
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
Я на 95% уверен, что базовое имя сделает это безопасным, но я бы чувствовал себя намного лучше, если бы существовало регулярное выражение, в котором белый цвет перечислял символы, которые разрешены в базовом имени. Например:
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
// allow only target paths in the form abc123.ext only
if (!preg_match('/^[a-z0-9 -]+\.[a-z0-9]+$/i', $target_path) {
// invalid data, handle error
}
У меня есть два комментария к оператору if для типа.
Первое использование in_array
, это значительно облегчит чтение и обслуживание кода.
Во-вторых, в операторе if произошла ошибка: последний ||
привязан к &&
для размера. Это связано с порядком операций . У вас есть что-то вроде a || (b && c)
, когда вы хотите (a || b) && c
.
Принимая оба эти комментария, я написал бы ваш ifm Statemnet следующим образом.
$allowed_types = array("image/gif", "image/png", "image/jpeg", "image/pjpeg", "text/css", "text/html", "text/javascript", "application/msword", "application/pdf");
if(!in_array($_FILES["uploadedfile"]["type"], $allowed_types) || $_FILES["file"]["size"] >= 1000000) {
Последнее, что я хотел бы упомянуть о вашем коде, если есть возможность внедрения SQL. Если вы используете вышеупомянутое регулярное выражение, это должно обеспечить безопасность ввода, но, поскольку я считаю, что обеспечение безопасности никогда не бывает плохим, я бы использовал mysql_real_escape_string
для дальнейшей очистки переменной $target_path
. Как ниже:
$target_path = mysql_real_escape_string($target_path);
mysql_query("INSERT INTO uploads(ID, URL) VALUES ('$client_ID', '$target_path')");
Я не знаю, решит ли это какие-либо из ваших проблем, но эти проблемы нужно исправить в коде и могут помочь в отладке, почему ваш код не работает.