while($info = mysql_fetch_array( $data )) {
// Print out the contents of the entry
Print "<li><b>Name:</b> ".$info['name'] . " <br />";
Print "<b>ID:</b> ".$info['ID']." <br />";
Print "<b>Age:</b> ".$info['age'] ." <br />";
Print "<b>Location:</b> ".$info['location'] ."<br /> ";
Print "<form action=delete.php method=POST><input name=ID value="safe(.$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>";
}
Print "</ol>";
这是我的代码。但是,我关注这一行:
Print "<form action=delete.php method=POST><input name=ID value=".$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>";
正如我之前的一篇文章所指出的那样,针对SQL注入攻击并不安全。
我从另一篇文章中借用了这个函数:
function safe($value){
return mysql_real_escape_string($value);
}
现在,我怎样才能使这部分免受攻击?
value=".$info['ID']."
非常感谢您的继续支持。
答案 0 :(得分:2)
是是,您需要逃生 (不要太强调)
要保护此代码免受攻击,您需要确保拥有经过身份验证的用户。正在查看此页面的用户是否已登录?如果是这样,他们的会话存储在哪里?
您使用什么逻辑来读取删除数据时需要使用的数据。
// Read data in at top to prevent E_STRICT errors if user messes with Query string
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated
$a_filter = (isset($_POST['a_filter']) ? $_POST['a_filter'] : '');
$query = "
SELECT
a, b, c
FROM
table
WHERE 1
AND a = " . mysql_real_escape_string($a_filter) . "
AND User_ID = " . intval($User_ID) . "
";
该查询将确保:
现在,当您将其打印为HTML时,请确保防范XSS攻击:
<td><?= htmlspecialchars($data); ?></td>
或者如果您在属性中:
<input type="text" name="a_filter" value="<? htmlspecialchars($data, ENT_QUOTES); ?>" />
现在,当您删除记录时,只需确保应用相同的安全措施......
// Read data in at top to prevent E_STRICT errors if user messes with Query string
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated
$ID = (int) (isset($_POST['id']) ? $_POST['id'] : 0);
$query = "
DELETE FROM
table
WHERE 1
AND ID = " . intval($ID) . "
AND User_ID = " . intval($User_ID) . "
";
这篇文章涉及转义SQL,转义HTML,转义HTML属性以及确保查询得到授权。
以下是关于逃避重要性的简短帖子:
http://blog.gahooa.com/answers/what-kind-of-data-needs-to-be-escaped/
答案 1 :(得分:1)
只需检查服务器是否有此条目。
要做到这一点:
$query = 'SELECT * FROM `table` WHERE `ID` = '.(int)$_POST['ID'];
将它转换为整数应该是非常安全的。如果它是一个字符串,它也将被转换。请参阅PHP的类型杂耍:http://www.php.net/manual/en/language.types.type-juggling.php
此外,通过检查此条目是否存在,您可以确保数据有效。
所以:
$result=mysql_query('DELETE FROM `savannah` WHERE `ID`='.(int)$_POST['ID']);
if(!$result){
die(mysql_error());
}
答案 2 :(得分:1)
这里的安全性可能应该是多级的 - 在这个特定的领域你没有其他的东西可以做。
你是否有一个独特的会话来识别用户(即使你还没有,简单地做这件事并不困难)?
如果是,那么您可以使用它来确定是否允许该用户删除一般项目,特别是该项目。
应该防止简单的注射攻击...
对于转义整数值 - 我通常将传入值转换为整数,这通常会消除流氓字符和无效输入的问题:
$safe['value'] = (int) $_POST['value'];
如果字符串不是数字,则您的安全值将为0.
编辑:我要提到的是,仅仅依赖于数据库字段是一个整数这一事实无论如何都是不安全的,并且在创建查询之前没有转义或转换输入,您将自己打开SQL注入。
答案 3 :(得分:1)
PHP过滤器(php 5.2.x功能)允许您验证和清理数据。