这个 Ruby PSQL 可以防止注入吗?
Is this Ruby PSQL safe from injection?
如果我通过 ruby 有以下 PSQL 语句:
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="✓" /><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>
我通常可以通过使用 ' 后跟字符来转义表单,但我似乎无法执行任何有效负载。
这样安全吗,还是有更复杂的转义序列来突破语句
没错,肯定是SQL注入。
要测试它,你可以传递 SQL 就像 '; select count(*) from users;
in params[:email]
.
为了避免 SQL 注入,您可以像这样重写代码:
sql2 = User.where(email: params[:email]).limit(1).to_sql
@result3 = Otherdb.connection.execute(sql2)
只需让 ActiveRecord 转义 并 清理 查询和参数即可。
如果我通过 ruby 有以下 PSQL 语句:
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="✓" /><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>
我通常可以通过使用 ' 后跟字符来转义表单,但我似乎无法执行任何有效负载。
这样安全吗,还是有更复杂的转义序列来突破语句
没错,肯定是SQL注入。
要测试它,你可以传递 SQL 就像 '; select count(*) from users;
in params[:email]
.
为了避免 SQL 注入,您可以像这样重写代码:
sql2 = User.where(email: params[:email]).limit(1).to_sql
@result3 = Otherdb.connection.execute(sql2)
只需让 ActiveRecord 转义 并 清理 查询和参数即可。