명령줄에서 $ 문자 이스케이프를 비활성화하는 방법

명령줄에서 $ 문자 이스케이프를 비활성화하는 방법

나는 이것에 관해 수많은 스레드를 읽었지만 그 중 누구도 이 문제를 다루지 않았습니다.

$이스케이프된 콘텐츠가 포함되어 있어 MySQL의 동작이 중단되는 명령줄에서 MySQL 표현식을 실행해야 합니다.

mysql -u root -p -e "some statement that change a pa$$word"

확인해 보라고 하더군요printf

printf "%q\n" 'pa$$word'
pa\$\$word

따라서 탈출할 필요가 없습니다. $그렇지 않으면 MySQL 쿼리에 잘못된 비밀번호가 입력됩니다.

답변1

당신은 일부 역학을 오해했습니다.

구문을 작은따옴표로 묶으면 즉 ', 확장이 없으며 s를 이스케이프할 필요가 없습니다 $. 확장은 예를 들어 특수 문자가 있으면 $이스케이프되지 않은 경우 특수 셸 프로세스가 트리거됨을 의미합니다. 따라서 작은따옴표를 사용하여 확장을 억제하는 경우 이를 이스케이프할 필요가 없습니다. 따라서 다음을 사용하십시오.

mysql -u root -p -e 'some statement that change a pa$$word'

에 관해서는 printf당신이 한 일은 검사가 아니었습니다. 호출하면 s %q에 백슬래시가 추가됩니다 $.

뭔가 작동하지 않는다면 $$셸의 PID(프로세스 ID)가 변경되었기 때문입니다. 이는 쉘이 일반적인 상황에서 특수 문자 조합으로 수행하는 작업입니다. 이스케이프 처리되지 않거나 작은 따옴표 안에 배치되지 않은 경우.

답변2

이것은 나에게 도움이 된다.

$ mysql -uroot -p'secret' -e "UPDATE users SET
password='pa\$\$word',email='[email protected]' WHERE id = 1;"

답변3

연장 하고 싶지 않다면 $variable다음 세 가지 옵션이 있습니다.

  1. 큰 따옴표 대신 작은 따옴표를 사용하십시오(단, 명령문에서 작은 따옴표를 이스케이프 처리해야 합니다! 따라서 여전히 필요합니다)적절하게탈출을 처리하세요!
  2. 지원되지 않는 다른 쉘을 사용하십시오. $variables(지원되지 않는 좋은 쉘은 모르겠습니다.)
  3. 실제로사용대신 변수가 유리하게 작동합니다(단, SQL 삽입 공격을 피하기 위해 여전히 SQL 이스케이프를 처리해야 한다는 점에 유의하세요).

즉, 이렇게 할 수 있습니다(변수 설정의 정확한 개념은 쉘에 따라 다릅니다! 다음은 아이디어를 제공하기 위해 테스트되지 않았습니다).

 pass='pa$$word'
 mysql -whatever "dangerous sql injection statement '$pass' if you cannot trust the pass variable"

하지만준비된 진술을 사용하십시오그리고 이를 위해 설계된 프로그래밍 언어는 쉘 스크립트가 아닙니다. 깨질 확률이 훨씬 적습니다.

기억하다작은 바비 테이블. 누군가가 비밀번호를 선택하면 어떻게 되나요 ');DROP TABLE users; --? 꽤 안전한 비밀번호죠?입력 내용을 정리하세요. 셸에서 이 작업을 수행하는 것은 고통스럽습니다. 따라서 이 작업에 셸을 사용하지 마세요.. 자세한 내용은 다음 책을 참조하세요. Ollie는 테이블 동물을 떨어뜨립니다.

관련 정보