PHP安全 - $ _POST - 注入

时间:2012-01-09 06:26:04

标签: php security

在开始使用我的网站之前,我对安全性做了一些想法:

这个问题是关于理解PHP中的Processing,而不是寻求保护表单的解决方案。

考虑这个完全不安全的xss和 如果提供了sql注入。

<?
if ($_POST['submit']=="1"){

    $input = $_POST['input'];
    echo "echo the input: ".$input."<br/>";
}
?>
<form action="<? $PHP_SELF;?>" method="POST">
<input type="text" name="input" value="<? echo $_POST['input'];?>"/>
<input type="hidden" name="submit" value="1"/>
<input type="submit" value="submit"/>
</form>

我想知道为什么这样的注射不起作用(在字段输入中):

";unset('index.php');

我天真地想着“;会结束回声而不是继续代码。 其实我很高兴这不行,但我想知道为什么。 在SQL中,这将实现工作'OR 1'。

我知道要使用addslasheshtmlspecialchars确保这一点,但这不是问题。我想了解一下php如何处理这个问题。

感谢

2 个答案:

答案 0 :(得分:1)

如果你通过eval(),它会起作用,但除此之外它只是一个像其他任何字符串一样的字符串。

答案 1 :(得分:1)

$ _POST数组元素的内容是字符串。所以,每当你提交“; unset('index.php');” (顺便说一下,没有取消对变量的处理吗?)你实际上将它作为字符串发送,而不是作为PHP可执行代码发送。

除非你使用eval(),否则你不必担心被评估的PHP代码。

另外,不要使用addslashes()来保护查询,而是使用库的专用函数,例如mysql的mysql_real_escape_string()。或者更好地将查询绑定与预准备语句和参数化查询结合使用。