在开始使用我的网站之前,我对安全性做了一些想法:
这个问题是关于理解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'。
我知道要使用addslashes或htmlspecialchars确保这一点,但这不是问题。我想了解一下php如何处理这个问题。
感谢
答案 0 :(得分:1)
如果你通过eval()
,它会起作用,但除此之外它只是一个像其他任何字符串一样的字符串。
答案 1 :(得分:1)
$ _POST数组元素的内容是字符串。所以,每当你提交“; unset('index.php');” (顺便说一下,没有取消对变量的处理吗?)你实际上将它作为字符串发送,而不是作为PHP可执行代码发送。
除非你使用eval(),否则你不必担心被评估的PHP代码。
另外,不要使用addslashes()来保护查询,而是使用库的专用函数,例如mysql的mysql_real_escape_string()。或者更好地将查询绑定与预准备语句和参数化查询结合使用。