【发布时间】:2013-10-27 11:05:18
【问题描述】:
我的注册表单中有一个字段,例如包含name 字段,它将存储在数据库中名为user_name varchar(20) 的字段中。很明显,我应该验证用户输入
如果我首先使用以下代码验证此字段:
<?php
if(emptiy($_pos['name']) || strlen($_post['name'])>20)
//send an not valid input error
else{
$name=htmlspcialchars($_post['name']);
//check for sql injection;
//insert name into database;}
?>
如果用户插入像<i> some one </i> 这样的名称,则字符串长度为17,因此else 部分将执行,名称将为&lt;i&gt some one &lt;/i&gt;,长度为28,此时插入db.in 时会产生错误如果我向用户发送一个错误,说他/她的输入太长了,他会感到困惑。我该怎么办?最好的方法是什么?
【问题讨论】:
-
您不应该在存储数据之前对其进行编码。将其原始存储(使用正确的转义,如
mysqli_real_escape_string或类似的)并在输出之前对其进行编码。这是因为如果您将其输出为 HTML 或 JSON 或其他任何内容,它需要不同的编码。 -
停止sql注入的最佳方法是使用mysqli或PDO准备语句将数据插入数据库。@Niet the Dark Absol是正确的,但不推荐使用mysqli_real_escape_string()函数。
-
出于安全原因,我永远不会使用像
mysqli_real escape_string()这样的函数,我使用 pdo 更安全。 -
我一直遵循
sanitize first, then validate的方法。 -
如果有人插入'some one',我应该将'some one'插入数据库还是先去除空格然后存储在数据库中?
标签: php validation sanitize