나는 이것에 관해 수많은 스레드를 읽었지만 그 중 누구도 이 문제를 다루지 않았습니다.
$
이스케이프된 콘텐츠가 포함되어 있어 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
다음 세 가지 옵션이 있습니다.
- 큰 따옴표 대신 작은 따옴표를 사용하십시오(단, 명령문에서 작은 따옴표를 이스케이프 처리해야 합니다! 따라서 여전히 필요합니다)적절하게탈출을 처리하세요!
- 지원되지 않는 다른 쉘을 사용하십시오.
$variables
(지원되지 않는 좋은 쉘은 모르겠습니다.) - 실제로사용대신 변수가 유리하게 작동합니다(단, SQL 삽입 공격을 피하기 위해 여전히 SQL 이스케이프를 처리해야 한다는 점에 유의하세요).
즉, 이렇게 할 수 있습니다(변수 설정의 정확한 개념은 쉘에 따라 다릅니다! 다음은 아이디어를 제공하기 위해 테스트되지 않았습니다).
pass='pa$$word'
mysql -whatever "dangerous sql injection statement '$pass' if you cannot trust the pass variable"
하지만준비된 진술을 사용하십시오그리고 이를 위해 설계된 프로그래밍 언어는 쉘 스크립트가 아닙니다. 깨질 확률이 훨씬 적습니다.
기억하다작은 바비 테이블. 누군가가 비밀번호를 선택하면 어떻게 되나요 ');DROP TABLE users; --
? 꽤 안전한 비밀번호죠?입력 내용을 정리하세요. 셸에서 이 작업을 수행하는 것은 고통스럽습니다. 따라서 이 작업에 셸을 사용하지 마세요.. 자세한 내용은 다음 책을 참조하세요.