Mi situación:
Estoy creando una aplicación web con PHP que permite a los usuarios escanear sus archivos en busca de virus. Permite al usuario cargar sus archivos a través del tipo de entrada html "archivo" o mediante una URL. He construido con éxito el lado html y PHP de las cosas y los usuarios pueden cargar archivos con éxito en mi servidor. Estoy usando Windows Server 2012 R2 con IIS como mi servidor.
Mi pregunta:
Por lo que yo sé, hay poca o ninguna seguridad (tanto en el lado del script como en el del servidor) para evitar vulnerabilidades de seguridad / ataques en mi sitio web o, lo que es peor, en el propio servidor. Soy consciente de que los atacantes podrían cargar y ejecutar archivos que pueden piratear mi servidor. Por lo tanto, ¿qué pasos puedo tomar para intentar eliminar estos problemas? .
Cosas de las que soy consciente:
Debido a la investigación que realicé, es a mi entender que potencialmente podría hacer lo siguiente para fortalecerme, sin embargo, estas son todas teorías, y no tengo idea de cómo implementarlas realmente (de ahí la razón por la que soy preguntando):
-
Restricción en los tipos de archivos (Sí, potencialmente podría bloquear los archivos .php, pero como ejemplo, no puedo bloquear los .exe comunes ya que el usuario probablemente escanearía un archivo ejecutable) ¿Cuál es el saldo correcto para este tipo de servicio, ya que la limitación de demasiados tipos de archivos simplemente elimina la facilidad de uso
-
Almacenamiento de archivos cargados en una unidad diferente: el directorio de mi sitio está en la unidad C y tengo una unidad D vacía que podría usar. ¿Cómo deshabilito el servidor para que no ejecute nada en la unidad específica? ¿Cómo evito que los hackers naveguen hacia esa unidad y ejecuten los archivos cargados?
Cosas que he probado:
- He creado una función para cambiar el nombre del archivo cargado en un hash md5, con una ID única al principio, por lo que el usuario no puede identificar el archivo fácilmente.
- Tipo de archivo limitado para eliminar las cargas .php? Tal vez hay otros que serían válidos para mi propósito?
Conclusion:
Esencialmente, así como respuestas a las preguntas menores arriba. Estoy buscando una lista de acciones que puedo tomar para fortalecer la aplicación y el servidor, para eliminar cualquier posible amenaza. Gracias
Código:
Como nota al margen, a continuación puedes ver mi código. Sólo en caso de que veas algo serio allí. O hay seguridad adicional que se puede agregar al código:
PHP:
$upload_directory = "uploads/";
$uploaded_file = $upload_directory . basename($_FILES["file"]["name"]);
$upload_ok = 1;
$image_file_type = pathinfo($uploaded_file, PATHINFO_EXTENSION);
// check for files bigger then 8mb
if($_FILES["file"]["size"] > 8388608){
print "your file exceeds 8mb";
$upload_ok = 0;
exit();
}
// only allow certain file types
if($image_file_type != "jpg" && $image_file_type != "png" && $image_file_type != "jpeg" && $image_file_type != "gif"){
print "invalid file type";
$upload_ok = 0;
exit();
}
// upload it
if($upload_ok != 0){
move_uploaded_file($_FILES["file"]["tmp_name"], $uploaded_file);
}
HTML:
<form method="post" action="index.php" enctype="multipart/form-data">
<label>Select Desired File</label><br>
<input type="file" name="file" id="file">
<input type="submit" name="submit" value="Scan File">
</form>