Pergunta

Tenho vindo a utilizar a API mysql no PHP, e agora estou convertendo para mysqli para o aumento da segurança. O exemplo de sintaxe Eu vi usos printf, e eu gostaria de saber se isso é necessário. No momento eu usar echo, assim:

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>";

Uma vez que com mysqli você deve ligar variáveis ??para o resultado, eu ter feito isso assim:

$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); 

e gostaria de saber se eu poderia simplesmente substituir a minha referência a $ linha com a variável ligada, por exemplo:

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

Existem quaisquer problemas de segurança com esta abordagem, ou é fina

Foi útil?

Solução

Eu não tenho certeza que a ligação torna a sua aplicação mais segura quando você está recebendo dados do banco de dados, no entanto, ele vai ajudar quando você está escrevendo para o DB como você não terá nenhum risco de injeção de SQL.

Independentemente da abordagem que você tomar para ler a partir da DB, você ainda precisa escapar a saída usando htmlspecialchars() se você não está totalmente certo de que os dados é completamente limpo. A declaração ligado não irá lidar com isso como você sugere em seu comentário para Ionut - você tem que escapar os dados de uma forma que é aplicável a onde você está mostrando o seu conteúdo. O PHP / MySQL não sei se você estiver imprimindo em um documento HTML comando / shell / json / etc. Não há um método de fuga mágica que faz com que qualquer seguro de dados para qualquer meio de saída.

Outras dicas

Eu concordo que mysqli é - pelo menos em princípio - melhor do que o pacote mysql, porque você pode vincular parâmetros, o que é tanto mais seguro e melhor para a execução da consulta. Dito isto, eu descobri pelo menos dois problemas graves com mysqli:

  • Bug 46808 é um problema grave que tem sido relatado em maneiras diferentes para pelo menos três anos e ainda ainda não foi fixada. Se você quiser usar colunas LONGTEXT você pode ter um problema; e
  • Às vezes eu fico erros estranhos onde mysqli falhar (com mensagens sem sentido sobre erros em "forma canário" ou algo assim). É neste ponto (combinado com (1)) que eu apenas tive que desistir de mysqli.

DOP é provavelmente a melhor escolha. Eu? Eu só voltou para mysql. É difícil argumentar com a simplicidade, enquanto você for cuidadoso com escapar strings e assim por diante.

Você deve escapar a saída ao servir páginas XML / HTML. Para que o uso htmlspecialchars ou htmlentities . De qualquer forma, você deve escapar de saída, independentemente da fonte de dados e o API usado para buscar os dados.

Eu sei que algumas vulnerabilidades de estouro de buffer foram relatados para determinadas versões do PHP. Eu não sei quais versões embora. Então, com base nisso, e assumindo a entrada não está devidamente filtrada, usando printf pode ser menos seguro do que usar echo . Depende muito do contexto embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top