如果插入用户输入而不修改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)
可以采取哪些措施来防止这种情况发生?
我正在尝试提出一个函数,我可以通过我的所有字符串来消毒.因此,从中输出的字符串对于数据库插入是安全的.但是那里有很多过滤功能我不知道应该使用/需要哪些功能.
请帮我填空:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
Run Code Online (Sandbox Code Playgroud) 我知道你绝不应该信任表单中的用户输入,主要是因为SQL注入的可能性.
但是,这是否也适用于唯一输入来自下拉列表的表单(见下文)?
我将保存$_POST['size']
到一个会话,然后在整个站点中使用该会话来查询各种数据库(使用mysqli
Select查询),任何SQL注入肯定会损害(可能会丢失)它们.
查询数据库的类型用户输入没有区域,只有下拉列表.
<form action="welcome.php" method="post">
<select name="size">
<option value="All">Select Size</option>
<option value="Large">Large</option>
<option value="Medium">Medium</option>
<option value="Small">Small</option>
</select>
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud) 我已经安装了 PHP 8.1,并开始测试我的旧项目。FILTER_SANITIZE_STRING
我已经像这样使用了过滤器:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)
现在我得到这个错误:
已弃用:常量 FILTER_SANITIZE_STRING 已弃用
当我使用时也会发生同样的情况FILTER_SANITIZE_STRIPPED
:
已弃用:常量 FILTER_SANITIZE_STRIPPED 已弃用
我可以用什么来代替它?
我有很多用户输入$_GET
和$_POST
...目前我总是写mysql_real_escape_string($_GET['var'])
..
我想知道你是否可以创建一个能够立即保护,转义和清理$_GET
/ $_POST
数组的函数,因此每次使用用户输入时都不必处理它.
我在想一个功能,例如cleanMe($input)
,和它里面,它应该做的mysql_real_escape_string
,htmlspecialchars
,strip_tags
,stripslashes
(我想这是所有做它的清洁与安全),然后返回$input
.
这可能吗?使得对所有工作的功能$_GET
和$_POST
,所以你会做只有这个:
$_GET = cleanMe($_GET);
$_POST = cleanMe($_POST);
Run Code Online (Sandbox Code Playgroud)
那么在以后的代码中,当您使用eg $_GET['blabla']
或者$_POST['haha']
它们时,它们是安全的,剥离的等等?
试了一下自己:
function cleanMe($input) {
$input = mysql_real_escape_string($input);
$input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
$input = strip_tags($input);
$input = stripslashes($input);
return $input;
}
Run Code Online (Sandbox Code Playgroud) 在我的项目中,我需要允许其他人向我的脚本发送ajax请求.因此,外部请求可能来自其他网站和域,也可能来自浏览器扩展.
我在脚本的顶部添加了这两行,让他们这样做:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:这里有任何我错过的安全考虑吗?这个简单的解决方案会造成严重的问
如果是这样,什么是更好的解决方案?
谢谢你的回复.
你如何通过PHP清理$ _GET -variables中的数据?
我在GET中只消除了一个变量strip_tags
.我不确定是否应该清理所有内容,因为上次将数据放入Postgres时,问题最容易通过使用来解决pg_prepare
.
所以有一段时间我一直在尝试使用不同的AJAX方法将数据发送到服务器,该服务器将被处理并存储在MySQL数据库中.
AJAX请求命中的页面api.php
使用PHP的PDO预处理语句来保存数据,因此MySQL注入并不是真正的问题,需要加密的密码或数据也是由api.php
我所要求的处理的这里.我的问题更多地涉及如何确保数据在从客户端传输到服务器时是安全的.
我目前有(对于我在下面列出的登录示例):
login.php
,并api.php
在这个例子中).api.php
访问功能时的速率限制.api.php
.api.php
(与问题无关).最后,我的问题是:
我知道每个人都有不同的方法来处理他们的网站数据和传输数据.我也明白,无论你做什么,你都永远不会受到100%的保护,因为你的系统可能存在一些你无法解释的漏洞和方法.我正在寻找有关安全发送数据的一般方法的反馈/改进,而不是批评下面的具体代码,因为它只是一个例子.但欢迎任何建设性的答案.感谢您抽出时间阅读/回答.
function loginUser() {
var process = "loginUser";
var data = $("form").serializeArray();
data[1].value = SHA512(data[1].value); // sha then encrypt on api.php page
data = JSON.stringify(data);
$("#loginButton").html('<i class="fa fa-spinner fa-pulse fa-lg fa-fw"></i> Login');
$.ajax({
type: "POST",
url: "api.php",
data: {"process": process, "data": data},
success: function(data) {
if (data.response.state == "success") …
Run Code Online (Sandbox Code Playgroud) 当我准备解决输入数据过滤和消毒问题时,我很好奇是否有最佳(或最常用)的做法?在将数据插入数据库之前过滤/清理数据(HTML,JavaScript等)是否更好?还是应该在准备数据以便在HTML中显示时完成?
几点说明:
谢谢!
php ×9
filter ×3
sanitization ×3
security ×3
ajax ×2
mysql ×2
cross-domain ×1
frameworks ×1
get ×1
html ×1
javascript ×1
jquery ×1
mysqli ×1
php-8.1 ×1
sanitize ×1
sql ×1
xss ×1