我知道我应该使用预准备语句,但我的下一个项目将是使用预准备语句,我只需要完成这个简单的小应用程序。
所以我的问题是:
下面这段代码安全吗?
我使用了htmlentities和mysql_real_escape_string,因为我认为这是一个安全的选择。
//Image
$imageInput = $_POST['Image'];
$imageClean = htmlentities($imageInput, ENT_QUOTES, 'UTF-8');
//Inserts values into relevant field and creates a new row.
mysql_query("UPDATE ***** SET image='" . mysql_real_escape_string($imageClean) . "' WHERE id=" . mysql_real_escape_string($idClean) . "");要添加$idClean代码,请执行以下操作:
//Id to change
if(ctype_digit($_POST['testimonial']))
{
$idInput = $_POST['testmonial'];
$idClean = htmlentities($idInput, ENT_QUTOES, 'UTF-8');
}谢谢你的帮助。
另外,如果你能提出一些建议,那就太好了。
发布于 2010-02-25 18:23:13
这取决于你的$idClean有多干净。
WHERE id=" . mysql_real_escape_string($idClean) . "mysql_real_escape_string only prepends backslashes to \x00, \n, \r, \, ', " and \x1a,但这不能阻止攻击者使用
$idClean = "1 OR 1=1 AND POSSIBLY OTHER SQL STATEMENTS"而不是mysql_real_escape_string,你应该把它转换成一个整型。
发布于 2010-02-25 18:20:17
您应该只在输出点应用实体转义-在数据库插入之前转义数据没有任何价值。也就是说,就mysql_real_escape_string而言,您正在做正确的事情。
除此之外,正如@Piskvor所说,idClean变量有一个潜在的问题。(例如,这是否被转换为int类型?)
您可以使用以下示例:
mysql_real_escape_string(intval($idClean))发布于 2010-02-25 18:22:15
$idClean从何而来?
另一个$_POST?它应该是一个整数,不是吗?
不要在它上面做html清理,只做$idClean = (int)$_POST['id'];...会“强制”它成为一个整数,“杀死”所有可能的xss/sql注入(我的意思是$idCelan )
一般来说,没有一种最好的方法来清理输入;一切都取决于输入应该包含什么,它将被存储在哪里,以及将来如何使用。
编辑:在你对回答的评论之后,我认为$idClean来自一个表单(可能是一个隐藏的输入)。
如果您希望防止恶意使用该表单,我建议您添加另一个带有散列$idclean隐藏字段,然后在进程页面中检查散列,以查看是否有人手动更改了id (如果您还没有这样做)
这通常是用户管理中的一个错误设计,不知道这是否是你的行为。
https://stackoverflow.com/questions/2333196
复制相似问题