2009-08-08 119 views
3

I read that you do not need to validate or sanitize user's input如果您使用准备好的语句,请了解用于准备语句的用户数据的验证

这在下面的例子中对我没有意义。

用户给他的电子邮件地址。

我通常运行此

输入验证码

// to validate data 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
    header("Location: index.php"); 
    die("Wrong email-address"); 
} 

声明说,我们并不需要,如果我们使用准备好的语句来验证数据,如下

代码,而不验证码

// to get email-address nad passhash from the db 
$result = pg_prepare($dbconn, "query2", 'SELECT email, passhash_md5 
    FROM users WHERE email = $1 
    AND passhash_md5 = $2;'); 
$result = pg_execute($dbconn, "query2", array($_POST['email'], $_POST['password'])); 
if(!$result) { 
    echo "An error occurred"; 
    exit; 
} 

由于我们使用pg_preparepg_execute,因此我不确定是否需要验证码或最后一个代码。

如果您使用准备好的语句,您是否需要考虑验证和消毒用户的输入?

+0

谢谢你的回答! – 2009-08-08 03:36:11

回答

6

您仍然需要验证您的数据,但您不必对其进行消毒。

使用预处理语句可防止插入恶意代码,但不会检查其形式是否有意义。

3

准备好的语句会照顾到恶意的意图,但它仍然取决于您,以确认您的用户正在输入您所期望的内容。

例如,如果您有一个要求输入电话号码的表单,输入“jkl; asdgfjkladg”的用户不会对您的数据库造成任何损害,但数据无可避免。

永远不要相信你的用户做他们应该做的事。如果您接受用户的输入,请进行验证以确保其正确执行。

4

分离验证和消毒是很重要的。

验证正在确保用户输入了正确的数据类型或格式。例如,在网络表单上,某人可能会破解选择输入的响应,以提交未在您提供的选择中显示的值。验证可以捕获此错误,并向用户提供合适的错误消息。用户也可以输入一个字符串到需要数字值的字段中。如果您在尝试查询之前未检查此内容,则查询可能会失败,并且确定原因并向用户提供错误消息将会更困难,或者查询可能会以不正确的数据静默地成功。

消毒确保数据在添加到数据库时不会造成伤害(或稍后显示在网站上,导致XSS攻击等)。如果$name = "O'Reilly",则查询INSERT INTO people (names) VALUES('$name')将失败,但准备好的语句在将字符串作为参数进行绑定时将自动转义单引号。当使用不同的字符集时,这一点尤为重要,因为可能不仅仅是引用问题的引号和斜杠字符,还可能允许SQL注入攻击。

为了检查用户是否真的输入了电子邮件地址,您需要保留验证码,因为PostgreSQL不知道输入的数据应该是电子邮件地址,并且会存储您提供的任何字符串到它。