如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
mysql_real_escape_string在大多数情况下是否足以清理用户输入?
::编辑::
我主要考虑的是防止SQL注入,但我最终想知道在应用mysql_real_escape_string之后是否可以信任用户数据,或者我是否应该采取额外措施来清理数据,然后再将其传递给应用程序和数据库.
我知道清除HTML字符的位置很重要,但我不认为有必要信任用户输入.
Ť
我是编码和PHP的新手,因此我想了解清理表单数据的最佳方法是什么,以避免格式错误的页面,代码注入等.我在下面找到的示例脚本是一个很好的例子吗?
代码最初发布于http://codeassembly.com/How-to-sanitize-your-php-input/
/**
* Sanitize only one variable .
* Returns the variable sanitized according to the desired type or true/false
* for certain data types if the variable does not correspond to the given data type.
*
* NOTE: True/False is returned only for telephone, pin, id_card data types
*
* @param mixed The variable itself
* @param string A string containing the desired variable type
* @return The sanitized variable or true/false
*/
function sanitizeOne($var, $type)
{ …Run Code Online (Sandbox Code Playgroud) function sanitizeString($var)
{
$var = stripslashes($var);
$var = htmlentities($var);
$var = strip_tags($var);
return $var;
}
function sanitizeMySQL($var)
{
$var = mysql_real_escape_string($var);
$var = sanitizeString($var);
return $var;
}
Run Code Online (Sandbox Code Playgroud)
我从一本书中得到了这两个函数,作者说通过使用这两个函数,我可以对XSS(第一个函数)和sql注入(第二个函数)更加安全.这些都是必要的吗?
另外,对于清理,我使用预准备语句来防止sql注入.
我会像这样使用它:
$variable = sanitizeString($_POST['user_input']);
$variable = sanitizeMySQL($_POST['user_input']);
Run Code Online (Sandbox Code Playgroud)
编辑:摆脱第一个函数的strip_tags,因为它没有做任何事情.使用这两个功能是否足以阻止大多数攻击并且对公共站点没问题?
我想在我的Web应用程序中阻止XSS攻击.我发现HTML编码输出可以真正防止XSS攻击.现在的问题是我如何对我的应用程序中的每个输出进行HTML编码?我有办法实现自动化吗?
我很欣赏JSP,ASP.net和PHP的答案.
我用这个:
function safeClean($n)
{
$n = trim($n);
if(get_magic_quotes_gpc())
{
$n = stripslashes($n);
}
$n = mysql_escape_string($n);
$n = htmlentities($n);
return $n;
}
Run Code Online (Sandbox Code Playgroud)
防止任何类型的MySQL注入或类似的东西.每当我用它来包裹$ _POST时:
$username = safeClean($_POST['user']);
$password = md5(safeClean($_POST['password']));
$vpassword = md5(safeClean($_POST['verify']));
$email = safeClean($_POST['email']);
Run Code Online (Sandbox Code Playgroud)
它甚至没有工作,但我附加了functions.php,目录是正确的,但根本不起作用,因为它只显示一个空白页...如果我从每个$ _POST中删除safeClean(),它的工作原理.
为什么这根本不起作用?