Como incluir caracteres especiais e valores NULL nas consultas MySQL

Usar aspas simples ou duplas, bem como outros caracteres especiais, em queries MySQL pode trazer alguma dor de cabeça para iniciantes.
Neste texto, vou procurar jogar alguma luz sobre este assunto e ajudar a resolvê-lo de forma definitiva.
Se achar interessante, inclua esta página nos seus favoritos, para futuras consultas — uma vez que o problema não é dos que incomodam com tanta frequência.
Capa do tutorial PHP - a função include e require

O problema dos caracteres especiais nas queries MySQL

Nos vários exemplos, usados nos artigos deste site, tenho evitado, quando possível, as “saias justas” com caracteres especiais.
Veja a seguinte query INSERT:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Alvarez','1973-10-12','azul','panelada',3);

A query, acima, funciona bem e há pouca possibilidade de alguém ter problemas com as suas aspas.
Contudo, se mudarmos o valor da coluna nome para “Mont’Alverne”, o problema aparece. Veja:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont'Alverne','1973-10-12','azul','panelada',3);

Note que o plugin de reconhecimento de sintaxe tem dificuldade para interpretar o valor entre as aspas simples.


O interpretador “pensa” que a segunda aspa está lá para fechar a primeira. Mas trata-se apenas de um apóstrofo — o suficiente para invalidar toda esta query.
Para evitar a confusão, há duas abordagens básicas possíveis.
Na primeira, você precede a aspa adicional com outra:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont''Alverne','1973-10-12','azul','panelada',3);

Na segunda, use uma barra invertida ou backslash:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12','azul','panelada',3);

Note a diferença entre estes 2 resultados e o primeiro.


Uma outra alternativa, é usar as tradicionais aspas duplas em torno do valor Mont'Alverne. Isto também funciona:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES("Mont'Alverne",'1973-10-12','azul','panelada',3);

Como lidar com valores NULL no MySQL

Se você tiver intenção de armazenar dados binários, tais como imagens ou audio, tem que ter em mente que estes valores contém todo tipo de caracteres especiais (e problemáticos), além de nulls (bytes de valor zero).
Embora o valor SQL null não seja um caractere especial, requer tratamento diferenciado.
No SQL, NULL indica “sem valor” ou “valor nulo”.
Em outros artigos, neste site, os valores NULL também têm sido evitados. Hoje, vamos encarar o problema e mostrar algumas formas de lidar com ele.
Por exemplo, se você não souber a cor preferida do Senhor Mont’Alverne, não pode preencher o valor com NULL, assim:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12','NULL','panelada',3);

O valor NULL dispensa as aspas. O correto é como se vê abaixo:

INSERT INTO perfil (nome,data_nasc,cor,comida,quantidade)
VALUES('Mont\'Alverne','1973-10-12',NULL,'panelada',3);

Como tratar os caracteres especiais dentro dentro de um script PHP

Cartoon - how sql injection work
Clique para ampliar.

Os problemas, acima, podem ser resolvidos com muita naturalidade, diretamente, por que as queries foram digitadas dentro do cliente MySQL — onde você mesmo está fornecendo os dados e pode corrigir e controlar as entradas.

A necessidade de lidar apropriadamente com os caracteres especiais é especialmente importante no ambiente da web, para o qual as queries são feitas com formulários input (form input).
Você precisa estar pronto para lidar com qualquer tipo de entrada de dados feita pelo usuário, de maneira geral.
Não é incomum, usuários maliciosos digitarem informações contendo caracteres problemáticos, com o objetivo deliberado de tentar burlar o seu
sistema
.

Se você estiver usando uma variável nome para receber aquele valor, em um script, não pode ter qualquer controle sobre o que o usuário do sistema vai te fornecer.
Neste caso, é preciso criar mecanismos para prever as diversas possibilidades de entradas e manipulá-las adequadamente.
No PHP, a função addslashes(), pode ser usada para tratar as entradas e torná-las seguras para ser inseridas em suas consultas MySQL.
Adicionalmente, a função unset() pode ser usada para forçar uma variável a não ter valor algum.

A função addslashes() retorna uma string com barras invertidas antes de caracteres que precisam ser escapados. Estes caracteres são aspas simples (‘), aspas duplas (“), barra invertida (\) e o byte NULL. manual do PHP.

Desta forma, o resultado de addslashes ("Mont'Alverne"), será Mont\'Alverne — que será recebido e gravado no banco de dados;
Se você precisar exibir este valor, sem o slash (a barra invertida), pode usar a função contrária: stripslashes() — com a mesma sintaxe.

Referências:

Manual do PHP: A função addslashes().

Como usar o MySQL como calculadora

Além das queries ou consultas de sempre, o cliente MySQL pode efetuar também algumas contas simples ou com algum nível adicional de complexidade.
Tal como no site de pesquisas Google, é possível introduzir diretamente no console do MySQL as operações que você deseja realizar —. Ele te dá o resultado.
MySQL and HP12C calculator

Operações aritméticas aceitas no MySQL

A tabela abaixo contem os operadores possíveis e uma breve descrição:

+ Adição
Subtração
* Multiplicação
/ Divisão
% Operação módulo
Menos unário
DIV Divisão de inteiros (disponível a partir do MySQL versão 4.1.0)

Tal como nas operações de cálculo aritmético básicas, que você já conhece, o MySQL também tem precedências entre operadores.
Assim, os operadores de multiplicação e de divisão são considerados antes dos operadores de adição e subtração.
Se dois operadores tiverem a mesma prioridade, a expressão é lida da esquerda para a direita.
Use os parênteses para forçar a priorização e para melhorar a legibilidade da expressão.

Use o comando SELECT para realizar operações aritméticas no MySQL

As operações aritméticas devem ser invocadas com o comando SELECT:

SELECT -2*3;
+------+
| -2*3 |
+------+
|   -6 |
+------+
1 row in set (0.00 sec)

Use espaçamentos e parênteses em prol da legibilidade:

SELECT (5 + 15) * (30 +20);
+---------------------+
| (5 + 15) * (30 +20) |
+---------------------+
|                1000 |
+---------------------+
1 row in set (0.03 sec)

Você pode multiplicar “em pleno voo” os itens de uma coluna.
No próximo exemplo vou pedir para que os itens da coluna id, da tabela clientesEstaduais sejam exibidos com seus valores multiplicados por 3:

SELECT id*3 FROM clientesEstaduais WHERE id > 10678;
+-------+
| id*3  |
+-------+
| 32055 |
| 32076 |
+-------+

Na query abaixo, vou pedir para exibir os valores originais da coluna id ao lado de seus valores multiplicados por 2:

SELECT id,id*2,nomecliente FROM clientesEstaduais WHERE id > 10668;
+-------+-------+----------------------+
| id    | id*2  | nomecliente          |
+-------+-------+----------------------+
| 10671 | 21342 | Remedios J. Owen     |
| 10678 | 21356 | Hope U. Houston      |
| 10685 | 21370 | Graiden F. Donaldson |
| 10692 | 21384 | Petra M. Dejesus     |
+-------+-------+----------------------+
4 rows in set (0.00 sec)

Faça as suas próprias experiências com suas próprias tabelas para entender melhor como funciona.
Experimente incluir o operador de raiz quadrada na brincadeira…

SELECT SQRT(id) FROM clientesEstaduais WHERE id > 10658;
+--------------------+
| SQRT(id)           |
+--------------------+
| 103.26664514740469 |
| 103.30053242844394 |
| 103.33440859655606 |
| 103.36827366266692 |
| 103.40212763768452 |
+--------------------+
5 rows in set (0.00 sec)

Calcluadoras HP 12c e MySQL

Como fazer operações aritméticas no MySQL, usando variáveis

Se você tiver interesse em saber um pouco mais, leia o post Como usar variáveis no MySQL.
No exemplo a seguir, vou mostrar como usar as variáveis para determinar o valor a ser pago em uma estadia em um hotel:

SET @diaria = 100.00;
SET @qtd_diarias = 5;
SET @taxa_servico = 8; /* este valor é um percentual */
SET @total_diarias = @diaria * @qtd_diarias;
SET @total_servico = (@total_diarias * @taxa_servico) / 100;
SET @total_a_pagar = @total_diarias + @total_servico;
SELECT @total_a_pagar;
+----------------+
| @total_a_pagar |
+----------------+
|  540.000000000 |
+----------------+
1 row in set (0.00 sec)

Como ocultar a versão do Apache no servidor

Neste post vou mostrar como alterar a configuração do Apache para não mostrar mais sua versão a requisições remotas. Esta é uma das várias medidas para fortalecer a segurança de um servidor web.
apache cadeado segurança
No artigo Como descobrir a versão do Apache em execução, mostro como obter informações sobre um servidor web remoto (e local). Neste artigo vou mostrar como inibir a exibição deste “excesso” de informações a pessoas estranhas.
Ninguém precisa saber que versão do Apache você está executando; que módulos você tem rodando e quais são as suas vulnerabilidades (baseado na versão do servidor web em execução).
Para ficar claro, o procedimento não protege contra vulnerabilidades existentes — mas dificulta a vida de quem deseja obter informações sobre o seu sistema.
Nos tópicos, a seguir, vou motrar como alterar as diretrizes ServerTokens e ServerSignature dentro do arquivo de configuração do Apache, para ser o mais objetivo possível. Depois vou explicar um pouco melhor a função delas.

Como configurar o Apache

Antes de se aventurar a alterar um arquivo do sistema, faça uma cópia de segurança dele:

sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.original

Em seguida abra o arquivo com o seu editor de texto favorito (eu vou usar o nano):

sudo nano /etc/apache2/apache2.conf

Agora altere (ou inclua) as diretrizes a que me referi acima para os seguintes valores:

ServerTokens ProductOnly
ServerSignature Off

Agora, reinicie o Apache:

sudo apachectl stop
sudo apachectl start

Agora faça um teste:

HEAD http://localhost

Altere o comando acima para os valores adequados à sua situação.
Note que no meu resultado, na 6a. linha, o nome do servidor é exibido apenas como Apache. Sua versão não é divulgada, nem tampouco o nome do sistema operacional.

200 OK
Connection: close
Date: Tue, 10 Mar 2015 21:17:25 GMT
Accept-Ranges: bytes
ETag: "2cf6-50fc9c4fbc26b"
Server: Apache
Vary: Accept-Encoding
Content-Length: 11510
Content-Type: text/html

Se quiser aumentar um pouco mais os seus conhecimentos, veja os testes descritos neste artigo.

O que é ServerTokens

A diretriz ServerTokens controla quando o cabeçalho (header) de resposta do servidor deverá, ou não, incluir uma descrição genérica do tipo de sistema operacional instalado — bem como informações sobre módulos compilados e disponíveis para uso.
Dentro do arquivo de configurações /etc/apache2/apache2.conf, esta diretriz pode ter os seguintes valores:

  • ProductOnly ou Prod — Diz para o Apache mostrar apenas o nome produto (que é o software de servidor web): Apache.
  • Major — Permite mostrar parcialmente a versão do Apache. Por exemplo: Apache/2
  • Minor — Permite ao Apache mostrar um pouco mais de sua versão. Por exemplo: Apache/2.4
  • Minimal ou Min — Torna o Apache ainda mais verboso sobre a sua versão. Por exemplo: Apache/2.4.12
  • OS — Vai além da exibição do número completo da versão do Apache e dá uma dica do sistema operacional usado no servidor. Por exemplo: Apache/2.4.12 (Unix)
  • Full ou padrão (sem parâmetros) — Mostra outros dados, como a versão do OPenSSL. Por exemplo: Apache/2.4.12 (Unix) OpenSSL/1.0.1l

Ajustar a diretiva ServerTokens para menos do que minimal não é recomendado pela documentação oficial do Apache — uma vez que dificulta encontrar erros (interoperacionais) no produto.
Além disto, a “obscuridade” não é política de segurança ideal. O correto é manter os seus servidores atualizados e ficar “ligado” no que tange eventuais descobertas de falhas de segurança

A diretriz ServerSignature do Apache

Dependendo do seus parâmetros de configuração, esta diretriz permite exibir um rodapé nos documentos gerados pelo servidor web (mensagens de erro, mod_proxy, a listagem do diretório ftp, saída do mod_info etc.)
O motivo para deixar esta opção ligada é que, em uma cadeia de proxies, pode ficar difícil dizer em qual dos servidores houve um erro.
A opção padrão é Off.
As outras opções são:

  • On — Adiciona uma linha com o número da versão do servidor e o valor de ServerName do host virtual.
  • Email — cria uma referência mailto: ao ServerAdmin, que permite a um visitante contatar o administrador do documento em exibição.

Após a versão 2.0.44, do Apache, a informação sobre a versão do servidor passou a ser controlada pelo ServerTokens.
Este site tem outros artigos sobre Apache, MySQL, PHP e configuração de servidores. Use o campo de busca, no canto superior direito para descobrir mais textos interessantes para você.

Referências

Leia a documentação oficial do Apache, sobre o assunto deste post, aqui.

Como criptografar seus arquivos com o gpg

O GnuPG, ou GPG, é uma ferramenta completa e poderosa que permite encriptar e proteger suas informações e sua comunicação.
O software oferece um sistema versátil de gestão de chaves, bem como módulos de acesso para todos os tipos de diretórios de chaves públicas.
logo do GnuPG
Neste artigo, vou mostrar como usar as opções básicas de encriptar e decriptar arquivos, na linha de comando — muito embora possa ser facilmente integrada a outras aplicações gráficas.
Por ser software livre o GnuPG respeita sua liberdade, sua privacidade e tem código aberto — que pode ser auditado.

O aplicativo vem já instalado nas grandes distribuições Linux — o que inclui o Fedora, o Ubuntu, Linux Mint, Debian etc. — e segue os padrões definidos pelo OpenPGP.

A sua distro Linux provavelmente vem com a versão clássica, disponível nos repositórios (que tem foco na portabilidade).
É possível baixar outras versões estáveis e mais avançadas, com suporte a outros recursos, no site oficial (veja os links ao final do artigo).

Mesmo que você não tenha nada a esconder, o uso de encriptação ajuda a preservar a privacidade das pessoas com quem você se comunica e dificulta a vida dos burocratas que comandam sistemas de vigilância, mundo afora.

Se você tem informações importantes a esconder — tais como dados da sua empresa, você está em boa companhia. Este é o sistema usado por Edward Snowden para esconder documentos comprometedores.

Como encriptar com o gpg

O comando pode ser usado para encriptar e decriptar eficientemente arquivos no Linux, FreeBSD e outros sistemas operacionais. Pode ser usado, também para criar assinaturas digitais.
Abra um terminal (Ctrl + Alt +T, no Ubuntu) e experimente os exemplos que seguem.
Para simplesmente criptografar um arquivo no Linux, use o gpg com a opção -c.
No exemplo, abaixo, o gpg é usado para encriptar o arquivo historico.txt:


gpg -c historico.txt

Após fornecer a senha e confirmar, o sistema irá criar um segundo arquivo historico.txt.gpg, já criptografado — este é o arquivo seguro.
gpg confirmar senha
Se este arquivo tiver informações sensíveis, é prudente apagar o original.


rm historico.txt

Tenha cuidado especial também com suas senhas.
Use senhas seguras para sua conta de usuário e senhas de frase para sua chave GnuPG secreta.
A sua senha é a parte mais frágil de todo o sistema de encriptação —. Programas de ataque por força bruta ou dicionário são fáceis de fazer e implementar.

Como decriptar um arquivo, com o gpg

Aproveitando o exemplo já dado, vou mostrar abaixo como recuperar os dados do arquivo encriptado historico.txt.gpg. É simples:


gpg historico.txt.gpg

gpg-password-decriptar-box
Diferenças entre um arquivo “normal” e criptografado:


ls -lah hist*

-rw-r--r-- 1 justincase henry 805 Jan 20 16:16 historico.txt
-rw-r--r-- 1 justincase henry 318 Jan 20 14:57 historico.txt.gpg

Se você esquecer a senha, será impossível reverter a criptografia.
O arquivo com extensão .gpg é um arquivo binário, em oposição ao original .txt.

Como usar o padrão ASCII

Você pode criar arquivos encriptados no padrão ASCII, em vez de usar o padrão OpenPGP (binário e mais seguro), com a opção -a.
Veja como:


gpg -ac historico.txt

O procedimento resultará na criação do arquivo historico.txt.asc, cujo conteúdo pode ser visto assim:


cat historico.txt.asc 

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1

jA0EAwMCOg2umLcrybhgycBpiRafCJBUEyKIyDMfXzEfCd+PwJVxI/+63ypL8lFZ
7+0YgzmSee+sooLTplJGbvlAVz23Y2KCcgmOC3v0URvUkT+7qhCsWLqYP0J21Ikr
Ie3DpqYwWxi9jeZ6Ae8cQDu0tUNVDV4zyV4Oim/DQZk7WwpIXgwwjnbfHEtdLqX3
etfq5OD8FMJN2nPoigIwLF6oq3m+CWGC64BqRx8QS81qMk6W8qmssC9iFYk84Csp
jOebc98pPjnt/5tnkHuISMRicLjtWKvlok2P80Nmv6h6WjkfpMmMZ4vAlkM7GtLl
IHiU9rPp31djpwpQoNQQN8VzJxMq4IdR0JAMaOUSV/oY6Q3voJOW8NW4+sOgLqAr
Ur9Tzwn+WMOo2pxBdjZ0/xI4mG6txDy6YLlh
=Tp7M
-----END PGP MESSAGE-----

Referências

Como montar partições e drives NTFS no Linux

Qualquer distro Linux atual tem suporte completo a leitura e escrita em sistemas de arquivos Windows, o que inclui o NTFS.
Os exemplos que seguem, foram aplicados a uma máquina Ubuntu 14.04 LTS, mas valem para Debian, Fedora ou qualquer outra distro Linux popular e atualizada.

Se você não estiver conseguindo realizar alguma operação com o drive, provavelmente falta algum módulo no seu kernel ou você não configurou algo adequadamente —. Neste texto, vou tentar mostrar algumas dicas de como montar partições NTFS, com todas as funções possíveis habilitadas.
Como montar partição NTFS no Linux - capa do tutorial

Cuidados básicos ao montar drives ou partições NTFS ou FAT32

Uma vez montado o drive, o Linux irá mostrar arquivos e pastas (diretórios) que, no Windows, estariam escondidos — o que pode expor arquivos de sistema. Portanto, é importante ter cuidado para não apagar o que não deve.

O Windows 7 armazena o estado do sistema em um arquivo em disco, quando entra em hibernação.
Ao “acordar”, restaura seu estado a partir daquele arquivo.
Isto quer dizer que você pode perder alterações feitas, durante a hibernação, em um drive compartilhado em uma máquina Windows (versão 7 e superior). — Manual do Ubuntu.

Um típico HD Windows costuma ter uma partição chamada “SYSTEM“, com tamanho entre 100 e 200 megabytes. A menos que você saiba o que está fazendo, não há qualquer necessidade de montá-la no Linux. A mesma dica vale para partições de recuperação do sistema, que costumam ser chamadas de “RECOVERY“.

Sistemas de arquivos comuns no Windows

Basicamente, os sistemas de arquivos mais comuns em sistemas Windows são estes:

  • O Windows 7, Vista, XP 2000, antigos sistemas NT e o Windows Server 2003 e 2008, são formatados com NTFS. O FAT32 é raramente usado, como padrão, nestas versões.
  • As versões anteriores, raramente usam o NTFS — O padrão é o FAT32.
  • Drives e cartões flash (pendrives, cartões SD etc) são tipicamente formatados como FAT16. Em alguns casos, é usado o exFAT.

Você pode verificar quais sistemas de arquivos estão sendo usados nos drives e dispositivos conectados ao seu computador com o comando fdisk:


sudo fdisk -lu

A relação dos sistemas de arquivos conectados pode ser extensa. O exemplo abaixo, mostra informações de um pendrive, conectado em /dev/sdc1 (no meu sistema):

Disco /dev/sdc: 4009 MB, 4009754624 bytes
84 cabeças, 22 setores/trilhas, 4237 cilindros, total de 7831552 setores
Unidades = setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho da E/S (mínimo/ideal): 512 bytes / 512 bytes
Identificador do disco: 0x00054216

Dispositivo Boot      Início        Fim      Blocos   Id  Sistema
/dev/sdc1              62     7831551     3915745    7  HPFS/NTFS/exFAT

Use o comando grep para obter um resultado mais compacto:


sudo fdisk -l | grep -i ntfs

/dev/sdc1              62     7831551     3915745    7  HPFS/NTFS/exFAT

No decorrer deste artigo, vou usar este dispositivo como exemplo — não esqueça de adaptar os exemplos dados à situação do seu sistema.

Suporte a NTFS no Linux

O Linux usa o driver ntfs-3g para ler e alterar partições NTFS.
O driver vem pré-instalado em várias distribuições — no Ubuntu, ele é parte da distro desde a versão 11.10.
Se você estiver usando uma distro Linux atual, provavelmente não precisará fazer nada para trabalhar plenamente com dispositivos e partições NTFS.
Se você estiver tendo problemas para alterar dados em alguma partição NTFS, cheque se o pacote ntfs-3g se encontra instalado em seu sistema.

Configure o Linux para montar automaticamente os dispositivos e partições NTFS

Se você pretende manter o drive sempre conectado à sua máquina Linux e deseja que ele seja sempre montado na inicialização, configurar as opções de montagem no arquivo /etc/fstab é uma boa idéia.
Será necessário adicionar um linha para cada partição a ser montada, no arquivo fstab.
A documentação oficial do Ubuntu, enumera, pelo menos 3 razões para configurar o fstab, em vez de montar pelo seu gerenciador de arquivos (Nautilus, no Ubuntu):

  • Quando mais de uma conta de usuário estiver ativa durante uma sessão — com o uso do fstab, é possível montar uma vez só, para todo mundo poder usar.
  • Quando você tem softwares ou bibliotecas configurados para usar a partição ou o drive em questão, na inicialização, você vai querer que tudo esteja pronto para eles, sem a sua interferẽncia.
  • Conveniência de ter um procedimento a mais automatizado no seu sistema.

Como configurar o fstab

Uma das melhores formas de automatizar o processo de montagem de um drive ou partição no Linux é fazê-lo pelo seu nome de volume — isto é especialmente útil, quando se trata de um pendrive, que vai ser conectado/desconectado sempre.

Por ora, use o comando blkid, para saber mais sobre a localização das unidades que já se encontram conectadas ao seu sistema:


sudo blkid

No nosso exemplo, o dispositivo que interessa é o último da lista:

/dev/sda1: UUID="ce32e86c-e404-4f84-8125-74d0fc4897f7" TYPE="swap" 
/dev/sda2: UUID="a2ab821d-ae58-42fc-9384-f96dfcdc22cc" TYPE="ext4" 
/dev/sdb1: UUID="eb8e4cca-42c6-498d-b5ba-cd397096b3e9" TYPE="ext4" 
/dev/sdc1: LABEL="NTFS-FLASH" UUID="4D016F2B3DF4A3CE" TYPE="ntfs"

De acordo com a listagem, acima, a partição a ser configurada no fstab é a /dev/sdc1 que, neste caso, corresponde a um drive flash USB (pendrive) — note que o nome do volume (LABEL) é NTFS-FLASH e o seu UUID é 4D016F2B3DF4A3CE.
Comece por criar um ponto de montagem ou mountpoint para cada dispositivo, que você for configurar no fstab.
O ponto de montagem é um diretório, que pode ter qualquer nome. Eu gosto de usar um nome semelhante ao do volume a ser montado:


sudo mkdir /media/ntfsflash

A seguir, faça backup do fstab:


sudo cp /etc/fstab /etc/fstab.original

Agora, abra o fstab com o seu editor preferido (eu vou de nano):


sudo nano /etc/fstab

Agora adicione a seguinte linha ao arquivo do fstab, para montar o dispositivo pelo seu UUID:


UUID=4D016F2B3DF4A3CE  /media/ntfsflash  ntfs-3g  defaults,windows_names,locale=pt_BR.utf8  0 0

Não se esqueça de substituir o UUID e ponto de montagem /media/ntfsflash por valores adequados ao seu sistema.
Se o seu idioma não for português do Brasil, você vai precisar adequar esta variável também.
Use o comando locale para determinar qual o valor mais adequado para você:


locale | grep LANG

Quando terminar de editar o fstab, grave as alterações e feche o editor.
Caso não saiba, para gravar as alterações no nano, use a combinação de teclas Ctrl+o.
Para fechar e sair do editor, use Ctrl+x.

Exemplo de execução do comando blkid
Clique, para ver detalhes.

A nova configuração do fstab terá efeito na próxima inicialização do sistema.
Se tiver pressa para ver o resultado, use o comando mount:


sudo mount -a

O comando, acima, monta todos (all) os dispositivos disponíveis e citados no fstab.
Se quiser, use o mount, para verificar se o seu dispositivo foi montado:


mount

/dev/sdb1 on / type ext4 (rw,errors=remount-ro,discard)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)

...

/dev/sda2 on /home type ext4 (rw)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=justincase)
/dev/sdc1 on /media/ntfsflash type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096)[/plain]

Como montar uma partição NTFS como apenas-leitura

Uma solução fácil para montar uma partição NTFS com restrição a escrita é usar o driver NTFS antigo.
Substitua a linha que você adicionou ao fstab por esta:

UUID=4D016F2B3DF4A3CE  /media/ntfsflash  ntfs  defaults,umask=222  0 0

Novamente, não se esqueça de adequar o exemplo ao seu caso.
O método preferível é usar o driver atual e especificar que a partição deve permanecer apenas para leitura.
Coloque a cláusula ‘ro’, logo após ‘defaults’:

UUID=4D016F2B3DF4A3CE  /media/ntfsflash  ntfs-3g  defaults,ro,windows_names,locale=pt_BR.utf8  0 0

Isto irá permitir que o acesso ocorra em condições maiores de segurança ao sistema externo.

Como montar um drive ou partição NTFS na linha de comando do Linux

Para montar um dispositivo NTFS, usando um comando no terminal, use o exemplo abaixo.
Não esqueca de substituir os valores do exemplo dado pelos que se adequam ao seu sistema:


sudo mount -t ntfs-3g /dev/sdc1 /media/ntfsflash/

Você pode montar o dispositivo, com detecção automática do sistema de arquivos:


sudo mount -t auto /dev/sdc1 /media/ntfsflash/

Referências