Paxdiablo дал хорошее решение вашей проблемы переполнения буфера, но это действительно наименьшая из ваших проблем здесь.Ваша большая проблема заключается в том, что вы слепо используете ввод от пользователя без предварительной проверки.
Например, выполнение вашей программы, например:
./your_app "\"goodbye data\" && rm -rf /"
, приведет к катастрофе, даже если вы запрограммируетене было проблем с переполнением буфера.Злоумышленник может с такой же легкостью передать весь сценарий оболочки, который сделал все виды неприятных вещей, все, что ему нужно было бы сделать, это переписать его, чтобы он поместился в одну строку.
Вам необходимо проверить входящего пользователя.перед тем, как передать его system()
, убедитесь, что он выглядит так, как вы ожидаете.А еще лучше избегайте использования system()
для пользовательского ввода целиком и вместо этого используйте более безопасные методы, чтобы делать то, что вам нужно (в вашем примере вы можете заменить свой вызов на system("echo ...")
на printf()
).Если вы абсолютно должны передать пользовательский ввод system()
, рассмотрите возможность запуска вашего приложения в ограниченной среде, такой как chroot
тюрьма, чтобы, по крайней мере, сделать более трудным что-либо неприятное.