Pregunta

He estado usando la API de MySQL en PHP, y ahora estoy convirtiendo a MySQL para una mayor seguridad. La sintaxis de ejemplo que he visto usa printf, y me gustaría saber si esto es necesario. En este momento uso echo, así:

echo "<h1>".$row['ARTICLE_NAME']."</h1>
<div id='leftlayer' class='leftlayer'>
<p><strong>Username: </strong>".$row['USERNAME']."
<p><strong>Article Number: </strong>".$row['ARTICLE_NO']."
<p><strong>Subtitle: </strong>".$row['SUBTITLE']."
<p><strong>Auction Start: </strong>".$row['ACCESSSTARTS']." 
</div>";

Dado que con mysqli debes vincular variables al resultado, lo he hecho así:

$getRecords->bind_result($ARTICLE_NO, $ARTICLE_NAME, $SUBTITLE$, $CURRENT_BID, $START_PRICE, $BID_COUNT, $QUANT_TOTAL, $QUANT_SOLD, $ACCESSSTARTS, $ACCESSENDS, $ACCESSORIGIN_END, $USERNAME, $BEST_BIDDER_ID, $FINISHED$, $WATCH$$, $BUYITNOW_PRICE, $PIC_URL, $PRIVATE_AUCTION, $AUCTION_TYPE, $ACCESSINSERT_DATE, $ACCESSUPDATE_DATE, $CAT_DESC$, $CAT_PATH, $ARTICLE_DESC, $COUNTRYCODE, $LOCATION$, $CONDITIONS, $REVISED$, $PAYPAL_ACCEPT, $PRE_TERMINATED, $SHIPPING_TO, $FEE_INSERTION, $FEE_FINAL$, $FEE_LISTING, $PIC_XXL$, $PIC_DIASHOW, $PIC_COUNT, $ITEM_SITE_ID); 

y me gustaría saber si simplemente podría reemplazar mi referencia a $ row con la variable enlazada, por ejemplo:

  <p><strong>Username: </strong>".$USERNAME."

¿Hay algún problema de seguridad con este enfoque o está bien?

¿Fue útil?

Solución

No estoy seguro de que el enlace haga que su aplicación sea más segura cuando obtiene datos de la base de datos, sin embargo, será útil cuando escriba en la base de datos, ya que no tendrá riesgo de inyección SQL.

Cualquiera que sea el enfoque que tome para leer desde el DB, aún necesita escapar de la salida usando htmlspecialchars() si no está completamente seguro de que los datos estén completamente limpios. La declaración enlazada no manejará esto como sugiere en su comentario a Ionut: debe escapar de los datos de una manera que sea aplicable a donde los está enviando. PHP / MySQL no sabe si está imprimiendo en un documento HTML / comando de shell / json / etc. No existe un método de escape mágico que haga que los datos sean seguros para cualquier medio de salida.

Otros consejos

Estoy de acuerdo en que mysqli es, al menos en principio, mejor que el paquete mysql porque puede enlazar parámetros, que son más seguros y mejores para la ejecución de consultas. Dicho esto, he descubierto al menos dos problemas graves con mysqli:

  • El error 46808 es un problema grave que se ha informado de diferentes maneras durante al menos tres años y aún no se ha solucionado. Si desea utilizar columnas LONGTEXT, puede tener un problema; y
  • A veces me salen errores raros en los que mysqli falla (con mensajes sin sentido sobre errores en " forma canaria " o somesuch). Es en este punto (combinado con (1)) que tuve que renunciar a mysqli.

PDO es probablemente una mejor opción. ¿Yo? Acabo de regresar a MySQL. Es difícil discutir con la simplicidad siempre y cuando tenga cuidado con escapar de las cadenas, etc.

Debería escapar de la salida al servir páginas XML / HTML. Para ese uso, htmlspecialchars o htmlentities . De todos modos, debe escapar de la salida independientemente de la fuente de datos y la API utilizada para obtener esos datos.

Sé que se han reportado algunas vulnerabilidades de desbordamiento de búfer para ciertas versiones de PHP. Sin embargo, no sé qué versiones. Entonces, en base a esto, y suponiendo que la entrada no se filtre correctamente, usar printf puede ser menos seguro que usar echo . Sin embargo, depende mucho del contexto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top