请帮助我清理进入mysql的php数据

请帮助我清理进入mysql的php数据,php,mysql,Php,Mysql,嗨,朋友们,我有一张mysqli连接的表格 <label for="fullname">Fullname</label> <input type="text" name="fullname" /> <label for="photo">Upload photo</label> <input name="photo" type="file"/> 请帮帮我,我正在一个实时站点上使用这个也许你需要mysql\u real\u

嗨,朋友们,我有一张mysqli连接的表格

<label for="fullname">Fullname</label>
<input type="text" name="fullname" />

<label for="photo">Upload photo</label>
<input name="photo" type="file"/>

请帮帮我,我正在一个实时站点上使用这个

也许你需要mysql\u real\u escape\u string()


我建议使用现有的PHP数据库库使用占位符:或者是来自Pear的内容,比如。有了占位符,数据库库就可以保证正确转义,代码也就更容易阅读了

在这种情况下,您的代码将类似于:

$sql = "INSERT INTO members (fullname,photo) VALUES (?, ?)";
$values = array($fullname, $photo) ;

$prepared = $link->prepare($sql) ;
$result = $prepared->execute($values) ;
编辑我刚刚意识到你正在使用mysqli,所以继续使用它或用于教程

$sql = "INSERT INTO members (fullname,photo) VALUES (?, ?)";
$stmt = $link->prepare($sql) ;
//ss means the 2 parameters after it should be treated as string, string
$stmt->bind_param('ss', $fullname, $photo) ;

$result = $stmt->execute() ;

使用准备好的语句:

$fullname = $_POST['fullname'];

    $uploaddir = './uploads/';
    //upload file in folder
    $uploadfile = $uploaddir. basename($_FILES['photo']['name']);
    //insert filename in db
    $upload_filename = basename($_FILES['photo']['name']);
    move_uploaded_file($_FILES['photo']['tmp_name'], $uploadfile);
    $photo = $upload_filename;

$sql = "INSERT INTO members(fullname,photo) VALUES(?, ?)";
$stmt = $link->prepare($sql);
$stmt->bind_param('ss',$fullname,$photo);
$stmt->execute();

有关更多信息,请参阅,这也有保护您免受攻击的好处。

当您使用
mysqli
时,您会得到参数化查询。这通常比自己尝试转义字符串要简单:

$q= $mysqli->prepare('INSERT INTO members (fullname, photo) VALUES (?, ?)');
$q->bind_param('ss', $fullname, $photo);
$q->execute();
请注意,信任用户提供的文件名进行文件上载是非常危险的。在您当前的代码中,用户可以上载
.php
文件,如果
uploads
文件夹暴露于web服务器,则该文件将允许攻击者在您的服务器上运行他们选择的任意代码

其他可能带来麻烦的文件名包括空字符串、非ASCII和控制字符、
.htaccess
在Apache服务器上,以及带有前导/尾随点和空格或使用Windows服务器上的系统保留文件名之一的文件。此外,似乎没有保护措施防止用户上传的照片覆盖了其他用户的照片,这很可能是偶然发生的

通常最好根据随机数或行的主键生成文件名,并添加所需的扩展名(例如
.jpeg
)。清理用户提供的文件名比您想象的要困难得多

请帮助我,我正在一个现场使用这个


如果这是向不受信任的用户公开的,我会认真关闭该网站,直到您修复它。

我想对此发表评论:

请注意,信任用户供应商文件名进行文件上载是有风险的。在您当前的代码中,用户可以上载.php文件,如果uploads文件夹向web服务器公开,则该文件将允许攻击者在您的服务器上运行他们选择的任意代码

通常最好根据随机数或行的主键生成文件名,并添加所需的扩展名(如jpeg)。清理用户提供的文件名比您想象的要困难得多

在我看来,清理文件名不是正确的方法。首先,一个可执行文件可以用任何文件名上传,也可以由其他用户下载。然后,许多用户将尝试启动该文件。如果它有病毒或类似病毒,用户现在就受到威胁


相反,可以用来检测类型,除非文件是严格意义上的图像,在这种情况下,我相信最好的做法似乎是使用检查它是否是允许的格式。

mysql\u real\u escape\u string
在使用mysqliCan时不需要。有人指导我如何限制文件类型吗?非常感谢
$q= $mysqli->prepare('INSERT INTO members (fullname, photo) VALUES (?, ?)');
$q->bind_param('ss', $fullname, $photo);
$q->execute();