Защищен ли этот Ruby PSQL от инъекций?

Если у меня есть следующий оператор PSQL через ruby:

user = User.find_by_email(params[:email])
sql2 = "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"email\" = \'#{params[:email]}\' LIMIT 1"
@result3 = Otherdb.connection.execute(sql2);

Сдается по следующей форме:

<form action = "/sessions" accept-charset = "UTF-8" method = "post"><input name = "utf8" type = "hidden" value = "&#x2713;" /><input type = "hidden" name = "authenticity_token" value = "tj5rfiJG+yip8gXhMSq/RR/Znu+L/nhkGnqqK78wggRjI85zl4T/wBEkouY8XWlh2aylfKH0lZWjH282fc6Qdg= = " />
    <div class = "login">
      <h1>Login to Web App</h1>
      <p id = "alert">User not present in db</p>
      <form method = "post" action = "">
        <p><label for = "email">Email</label>
        <input type = "text" name = "email" id = "email" /></p>
        <p><label for = "password">Password</label>
        <input type = "password" name = "password" id = "password" /></p>
        <p class = "remember_me">
    <label for = "remember_me">
     <input type = "checkbox" name = "remember_me" id = "remember_me" value = "1" />
     Remember me on this computer
    </label>
        </p>
        <p class = "submit"><input type = "submit" name = "commit" value = "Login" data-disable-with = "Login" /></p>
      </form>
    </div>
    </form>

Обычно мне удавалось избежать формы, используя ', за которыми следуют символы, но я не могу получить какие-либо полезные нагрузки для выполнения.

Это безопасно или есть более сложная escape-последовательность для выхода из инструкции?

Честно говоря, не уверен, как выглядит ваша часть password, но ввод ' OR 1=1-- в качестве адреса электронной почты вернет каждого пользователя. Так что да, это невероятно инъекционный, пожалуйста, не пытайтесь '; DROP TABLE users -- ради Бобби Столы

engineersmnky 29.05.2019 21:40
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это определенно SQL-инъекция. Чтобы проверить это, вы можете передать SQL, как '; select count(*) from users; в params[:email].

Чтобы избежать инъекции SQL, вы можете переписать свой код следующим образом:

sql2 = User.where(email: params[:email]).limit(1).to_sql
@result3 = Otherdb.connection.execute(sql2)

Просто позвольте ActiveRecord побег и дезинфицировать запрос и параметры для вас.

Другие вопросы по теме