【问题标题】:SQL-injection in PHP, how is it possible to send non-escaped quote to server?PHP中的SQL注入,如何将非转义报价发送到服务器?
【发布时间】:2015-05-06 18:52:30
【问题描述】:

这段代码似乎不安全:

<form method='post'>
<input type='text' name='x' style='width:1000px'>
<input type='submit' value='Send'>
</form>
<?php
if(isset($_POST['x']))
{
    require_once("db_connect.php");
    $q = mysqli_query($dbc, "SELECT x FROM table where x = '". $_POST['x'] ."'");
    while($r = mysqli_fetch_assoc($q))
        echo $r['x'];
}

但是当我发送恶意输入时,它不起作用。所以我做了类似的脚本:

<form method='post'>
<input type='text' name='x' style='width:1000px'>
<input type='submit' value='Send'>
</form>
<?php

if(isset($_POST['x']))
    echo $_POST['x'];

当我发送'(撇号)时,我收到了\'。所以它自动逃脱了。我的问题是,它发生在哪里?如何发送'clear'撇号?

【问题讨论】:

  • 这段代码不可能自动转义撇号。
  • 尝试将' or '3'='3 作为您的$_POST['x'] 发送到真实表格,例如用户名或其他任何内容
  • @MonkeyZeus 收到 \' 或 \'3\'=\'3
  • @ComPiler 你的代码不应该被认为是安全的——你的服务器可能启用了magic_quotes,这是一种已弃用的做法(事实上,它在 PHP 5.4 中已被删除)并且是 PHP 中的一个安全问题因为它在经常不存在时被依赖。为了安全起见,您应该使用prepare()/bind_param()/execute() 方法described in these answers
  • @developerwjk 完全有可能他有魔术引号,并且在 POST 数据上它会自动为他转义

标签: php mysql escaping sql-injection


【解决方案1】:

你可以打开Magic Quotes。你运行的是什么版本的PHP? Magic Quotes 在 5.3 中被弃用并在 5.4 中被删除,但它们在存在时默认为 ON。

Magic Quotes 会自动转义引号,但您真的不应该依赖它。您应该将其关闭并使用不同的转义方法,或者使用prepared statements 更好地查看。

运行get_magic_quotes_gpc() 以查看您是否启用了它们。如果是这样,请通过对 php.ini 文件进行以下更改来关闭它们:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

【讨论】:

  • 简单地说:便携性、性能和便利性。准备好的语句也更加安全,并且绝对是您要走的路,因为它们实际上将输入数据与查询分开。一定要阅读准备好的陈述。请参阅 @JayBlanchard 的评论,了解有关为什么不使用 Magic Quotes 的更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多