此代码似乎不安全:
<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'];
当我发送'
(撇号)时,我收到了\'
。所以它会自动转义。我的问题是,它发生在哪里?如何发送&#39;清除&#39;撇号?
答案 0 :(得分:5)
您可以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